Spring Boot: padre gen quando hai già un padre padre


184

Esiste un approccio raccomandato specifico all'inclusione del pom padre di avvio a molla nei progetti che hanno già un POM padre richiesto?

Cosa consiglieresti per i progetti che devono estendersi da un genitore organizzativo (questo è estremamente comune e persino qualcosa che molti / molti progetti sono stati pubblicati in Maven central a seconda dei repository feeder da cui provengono). La maggior parte degli elementi di compilazione è correlata alla creazione di JAR eseguibili (ad es. Esecuzione di Tomcat / Jetty incorporati). Ci sono modi per strutturare le cose in modo da poter ottenere tutte le dipendenze senza estendersi da un genitore (simile alla composizione rispetto all'eredità). Tuttavia, non è possibile ottenere una build in quel modo.

Quindi è preferibile includere tutto il pom padre di avvio a molla all'interno del POM padre richiesto o semplicemente avere una dipendenza POM nel file POM del progetto.

Altre opzioni?

TIA,

Scott

Risposte:


179

Puoi usare spring-boot-starter-parent come un "bom" (vedi Spring e Jersey altri progetti che supportano questa funzionalità ora) e includerlo solo nella sezione di gestione delle dipendenze con scope = import. In questo modo ottieni molto dei vantaggi del suo utilizzo (ovvero gestione delle dipendenze) senza sostituire le impostazioni nel proprio genitore.

Le altre 2 cose principali che fanno

  1. definire un carico di proprietà per impostare rapidamente le versioni delle dipendenze che si desidera sostituire
  2. configurare alcuni plugin con la configurazione predefinita (principalmente il plugin di avvio di Spring Boot). Quindi queste sono le cose che dovrai fare manualmente se usi il tuo genitore.

Esempio fornito nella documentazione di 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>

1
Immagino che questo tiri dentro i plugin - ombra ecc?
chrislovecnm,

3
No. Leggi il link: "puoi comunque mantenere il vantaggio della gestione delle dipendenze (ma non della gestione dei plugin)".
Dave Syer,

1
@DaveSyer Si prega di chiarire: 1: quando ho la mia abitudine project-parentpotrei aggiungere spring-boot-starter-parenta questo project-parent- va bene? Ho bisogno anche spring-boot-dependenciesin tale situazione? 2: Progetto normale di avvio a molla che eseguo usando avvio a molla: corsa. Come eseguire il progetto con diversi pom padre?
jsosnowski,

1
Lo snippet di codice sopra è sufficiente per ottenere le funzionalità di gestione delle dipendenze. Se vuoi plugin (come spring-boot:run) devi confutare quelli separatamente. Se lo desideri, puoi copiare incolla dal genitore Boot.
Dave Syer,

3
So che è un vecchio thread ma mi ha aiutato molto, grazie. Ho finito per leggere di questo meccanismo alla fonte maven.apache.org/guides/introduction/… . Spiega molto.
Bazeusz,

42

Aggiornamento del 04/01/2018 con 1.5.9.RELEASE.

Ho il codice completo e l'esempio eseguibile qui https://www.surasint.com/spring-boot-with-no-parent-example/

Hai bisogno di questo come base

   <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>

Ma ciò non è abbastanza, devi anche definire esplicitamente l'obiettivo per spring-boot-maven-plugin (Se usi Spring Boot come genitore, non devi definire esplicitamente questo)

    <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>

Altrimenti non puoi costruire come vaso eseguibile o guerra.

Non ancora, se si utilizza JSP, è necessario disporre di questo:

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

In caso contrario, verrà visualizzato questo messaggio di errore:

    [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]

NO NO, questo non è ancora sufficiente se si utilizza il profilo Maven e il filtro risorse con Spring Boot con "@" anziché "$ {}" (come nell'esempio https://www.surasint.com/spring-boot-maven -resource-filter / ). Quindi è necessario aggiungere esplicitamente questo in

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

E questo dentro

        <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>

Vedi l'esempio nel link https://www.surasint.com/spring-boot-with-no-parent-example/ .


@Arvind un avvertimento, il mio esempio è 1.5.9. È necessario utilizzare 1.5.11 (versione di ieri) perché questa versione ha una correzione per un grave problema di sicurezza.
Surasin Tancharoen,

come menzionato nel tuo blog, ho provato ad aggiungere il plugin maven-resources, ma mi sta ancora dando "nessun attributo manifest principale, in target". Ho provato a eseguire spring-boot: corri, anche questo non funziona :(
sagar27

@ sagar27 quale versione stai usando 1.5.X o 2.x? se è 2.x, potrebbe aver bisogno di più cose.
Surasin Tancharoen,

Grazie !! Mi hai salvato la vita
Jey Atiwat il

0

Secondo la risposta di Surasin Tancharoen, potresti anche voler definire il plugin maven surefire

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

e possibilmente includere plug-in fail-fast

    <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.