Spring Boot - pom parent lorsque vous avez déjà un pom parent

191

Existe-t-il une approche spécifique recommandée pour l'inclusion du pom parent spring-boot dans les projets qui ont déjà un POM parent requis?

Que recommandez-vous pour les projets qui doivent s'étendre à partir d'un parent organisationnel (c'est extrêmement courant et même quelque chose de beaucoup / la plupart des projets publiés sur Maven central en fonction des dépôts d'alimentation dont ils proviennent). La plupart des éléments de construction sont liés à la création de JAR exécutables (par exemple, l'exécution de Tomcat / Jetty intégré). Il existe des moyens de structurer les choses afin que vous puissiez obtenir toutes les dépendances sans s'étendre d'un parent (similaire à la composition ou à l'héritage). Cependant, vous ne pouvez pas obtenir une construction de cette façon.

Il est donc préférable d'inclure tout le pom parent de démarrage à ressort dans le POM parent requis ou d'avoir simplement une dépendance POM dans le fichier POM du projet.

Autres options?

TIA,

Scott

Scott C.
la source

Réponses:

184

Vous pouvez utiliser le spring-boot-starter-parent comme un "bom" (cf Spring et Jersey autres projets qui supportent cette fonctionnalité maintenant), et l'inclure uniquement dans la section de gestion des dépendances avec scope = import. des avantages de son utilisation (c.-à-d. la gestion des dépendances) sans remplacer les paramètres de votre parent actuel.

Les 2 principales autres choses qu'il fait sont

  1. définir une charge de propriétés pour définir rapidement les versions des dépendances que vous souhaitez remplacer
  2. configurer certains plugins avec la configuration par défaut (principalement le plugin Spring Boot maven). Voilà donc ce que vous devrez faire manuellement si vous utilisez votre propre parent.

Exemple fourni dans la documentation de 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
la source
1
Je suppose que cela attire les plugins - ombre, etc.?
chrislovecnm
4
Non. Lisez le lien: "vous pouvez toujours profiter de la gestion des dépendances (mais pas de la gestion des plugins)".
Dave Syer
1
@DaveSyer Veuillez clarifier: 1: Lorsque j'aurai ma coutume, project-parentje pourrais ajouter quelque spring-boot-starter-parentchose project-parent- est-ce que ça va? Ai-je également besoin spring-boot-dependenciesdans une telle situation? 2: Projet de démarrage à ressort normal que je lance en utilisant spring-boot: run. Comment exécuter un projet avec un pom parent différent?
jsosnowski
1
L'extrait de code ci-dessus est suffisant pour obtenir les fonctionnalités de gestion des dépendances. Si vous voulez des plugins (comme spring-boot:run), vous devez les réfuter séparément. Vous pouvez copier-coller à partir du parent Boot si vous le souhaitez.
Dave Syer
3
Je sais que c'est un vieux fil mais cela m'a beaucoup aidé, merci. J'ai fini par lire sur ce mécanisme à la source maven.apache.org/guides/introduction/… . Cela explique beaucoup de choses.
bazeusz le
45

Mise à jour 2018-01-04 avec 1.5.9.RELEASE.

J'ai le code complet et l'exemple exécutable ici https://www.surasint.com/spring-boot-with-no-parent-example/

Vous en avez besoin comme 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>

Mais cela ne suffit pas, vous devez également définir explicitement l'objectif pour spring-boot-maven-plugin (si vous utilisez Spring Boot comme parent, vous n'avez pas à définir explicitement cela)

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

Sinon, vous ne pouvez pas créer en tant que fichier jar ou war exécutable.

Pas encore, si vous utilisez JSP, vous devez avoir ceci:

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

Sinon, vous obtiendrez ce message d'erreur:

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

NON NON, ce n'est toujours pas suffisant si vous utilisez le profil Maven et le filtre de ressources avec Spring Boot avec "@" au lieu de "$ {}" (comme cet exemple https://www.surasint.com/spring-boot-maven -resource-filter / ). Ensuite, vous devez ajouter explicitement ceci dans

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

Et cela dans

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

Voir l'exemple dans le lien https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
la source
@Arvind un avertissement, mon exemple est 1.5.9. Vous devriez utiliser 1.5.11 (version d'hier) car cette version a un correctif pour un problème de sécurité sérieux.
Surasin Tancharoen
comme mentionné sur votre blog, j'ai essayé d'ajouter le plugin maven-resources-plugin, mais cela me donne toujours "aucun attribut manifeste principal, dans la cible". J'ai essayé d'exécuter spring-boot: run, cela ne fonctionne pas non plus :(
sagar27
@ sagar27 Quelle version utilisez-vous 1.5.X ou 2.x? si c'est 2.x, il peut avoir besoin de plus de chose.
Surasin Tancharoen le
Merci !! Vous m'avez sauvé la vie
Jey Atiwat
0

Selon la réponse de Surasin Tancharoen, vous pouvez également définir le plugin maven surefire

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

et éventuellement inclure un plugin rapide

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