Spring Boot - Eltern-Pom, wenn Sie bereits einen Eltern-Pom haben

184

Gibt es einen speziell empfohlenen Ansatz für die Einbeziehung des übergeordneten Spring-Boot-POM in Projekte, für die bereits ein übergeordnetes POM erforderlich ist?

Was empfehlen Sie für Projekte, die von einem übergeordneten Unternehmen ausgehen müssen (dies ist äußerst häufig und sogar etwas, das viele / die meisten Projekte in Maven Central veröffentlicht haben, abhängig von den Feeder-Repos, aus denen sie stammen). Der größte Teil des Build-Materials bezieht sich auf das Erstellen ausführbarer JARs (z. B. das Ausführen von eingebettetem Tomcat / Jetty). Es gibt Möglichkeiten, Dinge so zu strukturieren, dass Sie alle Abhängigkeiten abrufen können, ohne sie von einem übergeordneten Element zu erweitern (ähnlich wie Komposition vs. Vererbung). Auf diese Weise kann man allerdings kein Build-Zeug bekommen.

Daher ist es vorzuziehen, den gesamten übergeordneten Spring-Boot-POM in den erforderlichen übergeordneten POM aufzunehmen oder einfach eine POM-Abhängigkeit in der Projekt-POM-Datei zu haben.

Andere Optionen?

TIA,

Scott

Scott C.
quelle

Antworten:

179

Sie können das übergeordnete Spring-Boot-Starter-Element wie eine "Bom" verwenden (siehe Spring und Jersey, andere Projekte, die diese Funktion jetzt unterstützen) und es nur in den Abschnitt zur Abhängigkeitsverwaltung mit scope = import aufnehmen. Auf diese Weise erhalten Sie viel der Vorteile der Verwendung (dh Abhängigkeitsverwaltung), ohne die Einstellungen in Ihrem tatsächlichen übergeordneten Element zu ersetzen.

Die 2 wichtigsten anderen Dinge, die es tut, sind

  1. Definieren Sie eine Vielzahl von Eigenschaften, um schnell Versionen von Abhängigkeiten festzulegen, die Sie überschreiben möchten
  2. Konfigurieren Sie einige Plugins mit der Standardkonfiguration (hauptsächlich das Spring Boot Maven Plugin). Das sind also die Dinge, die Sie manuell tun müssen, wenn Sie Ihren eigenen Elternteil verwenden.

Beispiel in der Spring Boot-Dokumentation :

<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
quelle
1
Ich vermute, das zieht die Plugins ein - Schatten usw.?
chrislovecnm
3
Lesen Sie den Link: "Sie können weiterhin die Vorteile des Abhängigkeitsmanagements (aber nicht des Plugin-Managements) nutzen."
Dave Syer
1
@DaveSyer Bitte klären: 1: Wenn ich meine Gewohnheit habe project-parentich könnte hinzufügen , spring-boot-starter-parentum diese project-parent- ist es ok? Benötige ich auch spring-boot-dependenciesin einer solchen Situation? 2: Normales Spring-Boot-Projekt, das ich mit Spring-Boot: Run ausführe. Wie führe ich ein Projekt mit einem anderen übergeordneten POM aus?
Jsosnowski
1
Das obige Code-Snippet reicht aus, um die Abhängigkeitsverwaltungsfunktionen abzurufen. Wenn Sie Plugins (wie spring-boot:run) möchten , müssen Sie diese separat konfigurieren. Sie können das Einfügen vom übergeordneten Boot kopieren, wenn Sie möchten.
Dave Syer
3
Ich weiß, dass es ein alter Thread ist, aber er hat mir sehr geholfen, danke. Am Ende habe ich über diesen Mechanismus in der Quelle maven.apache.org/guides/introduction/… gelesen . Es erklärt viel.
Bazeusz
42

Update 2018-01-04 mit 1.5.9.RELEASE.

Ich habe vollständigen Code und ein ausführbares Beispiel hier https://www.surasint.com/spring-boot-with-no-parent-example/

Sie benötigen dies als Grundvoraussetzung

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

Dies reicht jedoch nicht aus. Sie müssen auch das Ziel für das Spring-Boot-Maven-Plugin explizit definieren (Wenn Sie Spring Boot als übergeordnetes Element verwenden, müssen Sie dies nicht explizit definieren.)

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

Andernfalls können Sie nicht als ausführbares JAR oder War erstellen.

Noch nicht, wenn Sie JSP verwenden, müssen Sie Folgendes haben:

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

Andernfalls wird folgende Fehlermeldung angezeigt:

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

NEIN NEIN, dies reicht immer noch nicht aus, wenn Sie Maven Profile und Resource Filter mit Spring Boot mit "@" anstelle von "$ {}" verwenden (wie in diesem Beispiel https://www.surasint.com/spring-boot-maven) -resource-filter / ). Dann müssen Sie dies explizit hinzufügen

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

Und das in

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

Siehe das Beispiel unter dem Link https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
quelle
@Arvind eine Warnung, mein Beispiel ist 1.5.9. Sie sollten 1.5.11 (Veröffentlichung gestern) verwenden, da diese Version eine Lösung für ein schwerwiegendes Sicherheitsproblem enthält.
Surasin Tancharoen
Wie in Ihrem Blog erwähnt, habe ich versucht, das Maven-Resources-Plugin hinzuzufügen, aber es gibt mir immer noch "kein Hauptmanifestattribut im Ziel". Ich habe versucht Spring-Boot zu laufen: laufen, das funktioniert auch nicht :(
sagar27
@ sagar27 welche version verwendest du 1.5.X oder 2.x? Wenn es 2.x ist, braucht es möglicherweise mehr.
Surasin Tancharoen
Danke !! Du hast mein Leben gerettet
Jey Atiwat
0

Gemäß der Antwort von Surasin Tancharoen möchten Sie möglicherweise auch das todsichere Maven-Plugin definieren

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

und möglicherweise ein Fail-Fast-Plugin enthalten

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