Spring Boot - nadrzędny pom, gdy już masz nadrzędny pom

184

Czy istnieje jakieś zalecane zalecane podejście do włączenia pom-bootu z systemem rozruchu sprężynowego do projektów, które już mają wymaganą nadrzędną POM?

Co polecasz dla projektów, które muszą rozciągać się od organizacyjnego rodzica (jest to niezwykle powszechne, a nawet coś, co wiele / większość projektów publikuje w Maven Central w zależności od repozytoriów feeder, z których pochodzą). Większość kompilacji związana jest z tworzeniem wykonywalnych plików JAR (np. Uruchamianie osadzonego Tomcat / Jetty). Istnieją sposoby na takie ustrukturyzowanie rzeczy, aby można było uzyskać wszystkie zależności bez wychodzenia od rodzica (podobnie jak kompozycja vs. dziedziczenie). W ten sposób nie można uzyskać rzeczy do kompilacji.

Dlatego lepiej jest zawrzeć wszystkie elementy nadprądowe rozruchu sprężynowego w wymaganym nadrzędnym POM lub po prostu mieć zależność POM w pliku POM projektu.

Inne opcje?

TIA,

Scott

Scott C.
źródło

Odpowiedzi:

179

Możesz użyć Spring-Boot-Starter-Parent jak „BOM” (por. Spring i Jersey inne projekty, które obsługują teraz tę funkcję) i umieścić ją tylko w sekcji zarządzania zależnościami o parametrze scope = import. korzyści z korzystania z niego (tj. zarządzania zależnościami) bez zastępowania ustawień w rzeczywistym rodzicu.

Dwie główne inne rzeczy, które robi

  1. zdefiniuj ładunek właściwości, aby szybko ustawić wersje zależności, które chcesz przesłonić
  2. skonfiguruj niektóre wtyczki z domyślną konfiguracją (głównie wtyczkę Spring Boot maven). To są rzeczy, które musisz zrobić ręcznie, jeśli używasz własnego rodzica.

Przykład podany w dokumentacji Spring Boot :

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Dave Syer
źródło
1
Zgaduję, że to przyciąga wtyczki - cień itp.?
chrislovecnm
3
Nie. Przeczytaj link: „nadal możesz zachować korzyści płynące z zarządzania zależnościami (ale nie z zarządzania wtyczkami)”.
Dave Syer
1
@DaveSyer Wyjaśnij: 1: Kiedy mam swój własny project-parent, mógłbym dodać spring-boot-starter-parentdo tego project-parent- czy jest w porządku? Czy potrzebuję również spring-boot-dependenciesw takiej sytuacji? 2: Normalny projekt rozruchu wiosennego Uruchamiam za pomocą rozruchu wiosennego: uruchamianie. Jak uruchomić projekt z innym rodzicielskim pom?
jsosnowski,
1
Powyższy fragment kodu jest wystarczający, aby uzyskać funkcje zarządzania zależnościami. Jeśli chcesz wtyczki (jak spring-boot:run), musisz zakwestionować je osobno. Możesz skopiować wklej z rodzica Boot, jeśli chcesz.
Dave Syer
3
Wiem, że to stary wątek, ale bardzo mi pomógł, dzięki. Skończyłem czytać o tym mechanizmie na stronie źródłowej maven.apache.org/guides/introduction/… . To dużo wyjaśnia.
bazeusz 29.01.16
42

Aktualizacja 2018-01-04 z 1.5.9. UWOLNIENIE.

Mam tutaj pełny kod i dostępny do uruchomienia przykład https://www.surasint.com/spring-boot-with-no-parent-example/

Potrzebujesz tego jako podstawy

   <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springframework.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Ale to nie wystarczy, musisz również wyraźnie zdefiniować cel dla Spring-boot-maven-plugin (Jeśli używasz Spring Boot jako elementu nadrzędnego, nie musisz tego jawnie definiować)

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${springframework.boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

W przeciwnym razie nie możesz budować jako wykonywalny jar lub wojna.

Jeszcze nie, jeśli używasz JSP, musisz mieć to:

<properties>    
  <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>

W przeciwnym razie pojawi się następujący komunikat o błędzie:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project spring-boot-09: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executi
ng in update mode) -> [Help 1]

NIE NIE, to wciąż nie wystarczy, jeśli używasz profilu Maven i filtru zasobów z Spring Boot z „@” zamiast „$ {}” (jak w tym przykładzie https://www.surasint.com/spring-boot-maven -resource-filter / ). Następnie musisz to wyraźnie dodać

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

I to w

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>

Zobacz przykład w linku https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
źródło
@ Znajdź ostrzeżenie, mój przykład to 1.5.9. Powinieneś użyć 1.5.11 (wydanie wczoraj), ponieważ ta wersja ma rozwiązanie poważnego problemu z bezpieczeństwem.
Surasin Tancharoen,
jak wspomniałem na twoim blogu, próbowałem dodać wtyczkę maven-resources-plugin, ale nadal daje mi to „brak głównego atrybutu manifestu w celu”. Próbowałem uruchomić spring-boot: run, to też nie działa :(
sagar27
@ sagar27, której wersji używasz 1.5.X lub 2.x? jeśli jest 2.x, może potrzebować więcej rzeczy.
Surasin Tancharoen
Dziękuję Ci !! Uratowałeś mi życie
Jey Atiwat
0

Zgodnie z odpowiedzią Surasin Tancharoen możesz także chcieć zdefiniować wtyczkę maven surefire

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </plugin>

i ewentualnie zawierać szybko działającą wtyczkę

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${maven-failsafe-plugin.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
trenunu
źródło