Jak stworzyć projekt Spring Boot w InteliJ IDEA Community Edition?

Projekt "Hello World" z użyciem Javy 17, platformy Spring 5.3.13, Spring Boot 2.6.1 i InteliJ IDEA Community Edition

Jak stworzyć projekt Spring Boot w InteliJ IDEA Community Edition?

Spring Framework

Spring Framework to platforma Open Source do tworzenia m.in. aplikacji internetowych czy biznesowych, skupiająca się na szybkości, prostocie i wydajności. Jest podzielona na wiele modułów (ich lista jest dostępna tutaj). Tworząc aplikację możemy wybrać tylko te, które będą nam potrzebne. Platforma została stworzona w 2003 roku jako odpowiedź na dużą złożoność wczesnej specyfikacji J2EE (Java 2 Enterprise Edition, później Java EE a od 2018 roku Jakarta EE).

UWAGA!
Różnice między aplikacją internetową a biznesową opisałem w artykule "Jak stworzyć projekt Jakarta EE w InteliJ IDEA Community Edition?"

Spring Boot

Spring Boot pozwala zminimalizować czas, w którym jesteś w stanie uruchomić swoją aplikację. Większość konfiguracji posiada domyślne wartości, co znacząco usprawnia proces tworzenia aplikacji. Ponadto Spring Boot korzysta z embedowanego (nie musimy go instalować) serwera aplikacji Tomcat, Jetty czy Undertow, w związku z czym sam plik JAR wystarczy do uruchomienia aplikacji (nie ma potrzeby deployowania pliku WAR na zewnętrznym serwerze aplikacji).

Spring Framework jest jak składniki, z których możesz zrobić tort. Spring Boot jest jak gotowy tort, który możesz dowolnie zmieniać

Stworzenie projektu ze Spring Initializr

Spring Initializr pozwala w wygodny sposób stworzyć projekt Spring Boot na kilka sposobów:

Co ciekawe, nazwa Initializr jest literówką (brakuje e między z a r), ale zamierzoną. Została zainspirowana projektem http://www.initializr.com

InteliJ IDEA Community Edition to darmowa wersja zintegrowanego środowiska programistycznego InteliJ IDEA rozwijana przez społeczność Open Source. Wersja ta nie posiada wsparcia dla Springa (jak już wspomniałem wyżej posiada je tylko płatna wersja Ultimate). W związku z tym stwórzmy nasz pierwszy projekt Spring Boot przez przeglądarkę:

Kliknięcie w obrazek przeniesie Cię do strony Spring Initializr z konfiguracją jak powyżej
UWAGA!
W chwili pisania posta dostępny był Spring Boot 2.6.1. Kilka dni temu wyszedł Spring Boot 2.6.2, który łata podatność Log4J. W związku z tym powinieneś używać wersję 2.6.2 lub wyższą.

W Spring Initializr mamy kilka opcji do ustawienia:

  • Project - narzędzie do budowania projektu: używamy Mavena
  • Language - język projektu: programujemy w Javie
  • Spring Boot - wersja: wybieramy najnowszą, która nie jest SNAPSHOT. SNAPSHOT to wersja, która nie została jeszcze oficjalnie wydana i wciąz trwają nad nią prace.
  • Project Metadata - metadane projektu:
    • Group - groupId w Mavenie. Grupa artefaktu. Standardem jest odwrócona domena
    • Artifact - artifactId w Mavenie. Nazwa artefaktu
    • Name - name w Mavenie. Nazwa projektu
    • Description - description w Mavenie. Opis projektu
    • Package name - nazwa pakietu, w którym będziemy umieszczać klasy Java
    • Packaging - packaging w Mavenie. Sposób pakowania projektu: wybieramy wykonywalny JAR (więcej o nim w dalszej części artykułu)
    • Java - wersja Javy: najnowszy obecnie LTS, czyli 17
  • Dependencies - zależności projektu:
    • Spring Web - potrzebny do budowania aplikacji internetowych używających Spring MVC. Dostarcza embedowany serwer aplikacji Tomcat
    • Thymeleaf - silnik szablonów HTML, dzięki któremu przeglądarka może je poprawnie wyświetlić
    • Spring Boot DevTools - narzędzia przydatne podczas tworzenia aplikacji. Pozwala m.in. automatycznie zrestartować aplikację lub przeładowywać przeglądarkę gdy zmieniają się pliki

Przycisk Generate spowoduje wygenerowanie projektu, który możemy ściągnąć w formie archiwum ZIP, rozpakować poleceniem unzip spring-boot-hello-world.zip -d ~/projects a następnie otworzyć go w InteliJ IDEA opcją: File -> New -> Project from Existing Sources... -> Import project from external model -> Maven.

Pierwszy kontroler i strona Hello World

W Springu żądania HTTP są obsługiwane przez kontroler (ang. controller). Klasa kontrolera będzie oznaczona adnotacją @Controller.

Stwórzmy więc nasz pierwszy kontroler w src/main/java w pakiecie pl.javowiec.springboothelloworld.controller jako klasę HelloWorldController:

package pl.javowiec.springboothelloworld.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloWorldController {

    @GetMapping("/helloworld")
    public String helloWorld(
            @RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "helloworld";
    }

}

Obsłużenie przez kontroler żądania GET przychodzącego pod adresem /helloworld jest gwarantowane dzięki adnotacji @GetMapping.

Do parametru name metody helloWorld jest przypisywana wartość parametru zapytania GET o tej samej nazwie dzięki użyciu adnotacji @RequestParam. Zwróć uwagę, że parametr name metody posiada domyślną wartość World, czyli gdy parametr zapytania GET nie istnieje.

Żądanie jest obsługiwane poprzez dodanie atrybutu name do modelu (ang. model) i zwrócenie nazwy widoku (ang. view) helloworld. Dodanie parametru do modelu sprawia, że widok będzie mógł z niego skorzystać. Te trzy elementy: model, widok i kontroler składają się na wzorzec MVC (Model-View-Controller). W Springu jest on znany jako Spring Web MVC.

Widok jest odpowiedzialny za renderowanie treści HTML. Będzie nim plik helloworld.html w src/main/resources/templates:

<!DOCTYPE html>
<html lang="pl" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Spring Boot - Hello World</title>
    </head>
    <body>
        <p th:text="'Hello, ' + ${name} + '!'"/>
    </body>
</html>

Zwróć uwagę, że w paragrafie <p th:text="'Hello, ' + ${name} + '!'"/> wykorzystujemy wyrażenie th:text z Thymeleaf, aby wyrenderować wartość zmiennej ${name} ustawionej w modelu przez kontroler. Ten plik HTML jest szablonem HTML, w związku z czym może być wykorzystany do wyświetlenia różnej zawartości (wartość w ${name} może być różna).

Miło byłoby również mieć stronę startową. Tak więc stwórzmy plik index.html w src/main/resources/static:

<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="UTF-8">
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"
              crossorigin="anonymous">
        <title>Spring Boot - Hello World</title>
    </head>
    <body>
        <div class="container">
            <div class="row justify-content-center">
                <div class="col-6 text-center m-4">
                    <h1>Spring Boot</h1>
                    <a class="btn btn-primary m-4" href="/helloworld">Hello World - kliknij mnie!</a>
                    <img src="https://media.giphy.com/media/MiXZKGhihYB6iP3quR/giphy.gif"
                         class="img-fluid" alt="Hello World image">
                </div>
            </div>
        </div>
    </body>
</html>

Strona ta jest statyczna (nie jest szablonem), dlatego jest umieszczona w folderze static a nie templates. Jest podobna do tej z artykułu "Jak stworzyć projekt Jakarta EE w InteliJ IDEA Community" i również korzysta z biblioteki Bootstrap.

Spring Initializr generując projekt, wygenerował także klasę SpringBootHelloWorldApplication w folderze src/main/java i pakiecie pl.javowiec.springboothelloworld:

package pl.javowiec.springboothelloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootHelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloWorldApplication.class, args);
    }

}

Klasa ta jest oznaczona adnotacją @SpringBootApplication, która sprawia, że dodaje ją do kontekstu aplikacji, uruchamia automatyczną konfigurację i włącza skanowanie komponentów Springa takich jak kontroler w pakiecie pl.javowiec.springboothelloworld i innych będących jego częścią. Metoda main tej klasy ma za zadanie uruchomienie aplikacji.

Teraz, gdy skończyliśmy kodować, możemy włączyć aplikację skrótem CTRL + SHIFT + F10 mając otwartą klasę SpringBootHelloWorldApplication i przejść w przeglądarce pod adres http://localhost:8080

Strona startowa z użyciem biblioteki Bootstrap

Po kliknięciu przycisku Hello World zostaniemy przeniesieni pod adres http://localhost:8080/helloworld, gdzie wyświetli nam się napis Hello World! :). Jak widzisz kontroler pomyślnie obsłużył żądanie, zaś parametr name przyjął domyślną wartość World:

Odpowiedź z kontrolera HelloWorldController

Wartość parametru name w kontrolerze możemy zmienić poprzez dodanie go do żądania GET po znaku zapytania ? w adresie: http://localhost:8080/helloworld?name=Javowcu

Dostosowana odpowiedź z kontrolera HelloWorldController

Nie zapomnij wyłączyć aplikacji skrótem klawiszowym CTRL + F2 przed uruchomieniem jej w dalszej części artykułu z poziomu wiersza poleceń!

Spring Boot DevTools

Gdy nanosisz zmiany w projekcie, dzięki DevTools (narzędzia developerskie) możesz w szybki sposób zaktualizować aplikację poprzez użycie skrótów klawiszowych:

  • CTRL + F9 - buduje cały projekt
  • CTRL + SHIFT + 9 - kompiluje otwarty plik

a następnie odświeżenie aplikacji w przeglądarce skrótem klawiszowym F5. Automatyczne odświeżanie przeglądarki można ustawić poprzez funkcję LiveReload. Jak to zrobić opiszę w jednym z przyszłych artykułów 😜

Wykonywalny JAR

Aby wygenerować wykonywalny JAR (ang. executable JAR), musimy przejść w terminalu do folderu z projektem:

cd ~/projects/spring-boot-hello-world

gdzie ~ to skrót do katalogu domowego użytkownika (/home/javowiec). Następnie musimy wywołać Mavena by spakował nasz projekt do pliku JAR poleceniem:

mvn clean package

Po pomyślnej operacji plik spring-boot-hello-world-0.0.1-SNAPSHOT.jar zostanie wygenerowany w folderze target. Możemy go uruchomić (wykonać) poleceniem:

java -jar target/spring-boot-hello-world-0.0.1-SNAPSHOT.jar
Uruchomienie aplikacji spakowanej do wykonywalnego JARA

Po uruchomieniu możemy przejść do przeglądarki, gdzie pod adresem http://localhost:8080 będzie na nas czekała gotowa aplikacja. Udało nam się to, ponieważ do JARa został spakowany embedowany serwer Tomcat.

Jeżeli nie wyłączysz aplikacji uruchomionej w InteliJ przed uruchomieniem jej z terminala, możesz spodziewać się wyjątku java.net.BindException, który mówi, że port 8080 jest już w użyciu. Oznacza to, że z danego portu w tym samym czasie może korzystać tylko jedna uruchomiona aplikacja.

Do wyłączenia aplikacji uruchomionej w terminalu wystarczy nam skrót CTRL + C.

Aplikację możemy też uruchomić przy użyciu pluginu spring-boot-maven-plugin poleceniem:

mvn clean spring-boot:run

Stworzenie projektu ze Spring Boot CLI

Na koniec przedstawię jeszcze drugi sposób tworzenia projektu z użyciem Spring Boot CLI. Najpierw musimy go zainstalować przy pomocy SdkMana poleceniem sdk install springboot 2.6.2.

Instalacja Spring Boot CLI w wersji 2.6.1 przy pomocy SdkMana
UWAGA!
Jak już wspomniałem wcześniej, w chwili pisania posta dostępny był Spring Boot 2.6.1. Kilka dni temu wyszedł Spring Boot 2.6.2, który łata podatność Log4J. W związku z tym powinieneś używać wersję 2.6.2 lub wyższą.

Wersję zainstalowanego Spring Boot CLI możemy sprawdzić poleceniem spring --version. Z kolei listę możliwych zależności i parametrów wyświetlimy poleceniem spring init --list. Wygenerowanie i rozpakowanie tego samego projektu jak ten stworzony przez przeglądarkę osiągniemy komendą:

spring init --group pl.javowiec --name spring-boot-hello-world --package-name pl.javowiec.springboothelloworld --java-version 17 --dependencies web,thymeleaf,devtools spring-boot-hello-world
Generacja i rozpakowanie projektu przy pomocy Spring Boot CLI

GitHub

Kod źródłowy jest udostępniony na GitHubie. Poniżej link 🙂

GitHub - JavowiecPL/spring-boot-hello-world: Gotowy projekt “Hello World” z kategorii Spring stworzony na potrzeby postów publikowanych na blogu Javowiec.pl
Gotowy projekt &quot;Hello World&quot; z kategorii Spring stworzony na potrzeby postów publikowanych na blogu Javowiec.pl - GitHub - JavowiecPL/spring-boot-hello-world: Gotowy projekt &quot;Hello W...

Podsumowanie

W tym artykule pokazałem Ci jak wygenerować projekt z użyciem Spring Initializr sposobem przez przeglądarkę i wiersz poleceń. Następnie pokazałem Ci jak stworzyć projekt "Hello World" z użyciem Javy 17, platformy Spring 5.3.13, Spring Boot 2.6.1 i InteliJ IDEA Community Edition.

Pomimo, że wersja Community nie posiada wsparcia dla Springa, wraz ze Spring Initializr udało nam się stworzyć, a potem uruchomić pierwszą aplikację. Zachęcam do dalszego eksperymentowania 😉

No i oczywiście Wesołych Świąt! Życzę Ci zdrowia, szczęścia, pomyślności, rozszerzania wiedzy technicznej wraz z Javowiec.pl i abyś nadchodzące święta spędził w pięknej rodzinnej atmosferze wśród najbliższych Ci osób 😊⁠

Liczba komentarzy:

Zaloguj się lub dołącz do społeczności Javowców, aby móc uczestniczyć w dyskusji 🙂