Spring Boot - родительский пом, когда у вас уже есть родительский пом

184

Существует ли конкретный рекомендуемый подход для включения родительского pom при загрузке в проекты, в которых уже есть требуемый родительский pom?

Что вы порекомендуете для проектов, которые должны быть расширены от родительской организации (это очень часто, и даже то, что многие / большинство проектов публикуют в Maven central в зависимости от репозиториев фидеров, из которых они исходят). Большая часть сборки связана с созданием исполняемых JAR-файлов (например, запуск встроенного Tomcat / Jetty). Есть способы структурировать вещи так, чтобы вы могли получить все зависимости, не выходя за пределы родительского (аналогично составу против наследования). Вы не можете получить материал для сборки таким образом, хотя.

Поэтому желательно включить все родительские pom при загрузке внутри требуемого родительского POM или просто иметь зависимость POM в файле POM проекта.

Другие варианты?

ТИА,

Скотт

Скотт С.
источник

Ответы:

179

Вы можете использовать spring-boot-starter-parent как «bom» (см. Spring и Jersey другие проекты, которые поддерживают эту функцию сейчас) и включать его только в раздел управления зависимостями с помощью scope = import. Таким образом, вы получаете много о преимуществах его использования (то есть управления зависимостями) без замены параметров вашего фактического родителя.

2 главных других вещи это

  1. определить загрузку свойств для быстрой установки версий зависимостей, которые вы хотите переопределить
  2. настроить некоторые плагины с конфигурацией по умолчанию (главным образом, плагин Spring Boot maven). Так что это то, что вам придется делать вручную, если вы используете своего родителя.

Пример предоставлен в документации 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
Я предполагаю, что это тянет за плагинов - тень и т. Д.?
chrislovecnm
3
Нет. Прочитайте ссылку: «Вы все еще можете использовать преимущества управления зависимостями (но не управления плагинами)».
Дэйв Сайер
1
@DaveSyer Пожалуйста, уточните: 1: Когда у меня есть свой заказ, project-parentя могу добавить spring-boot-starter-parentк этому project-parent- это нормально? Мне тоже нужно spring-boot-dependenciesв такой ситуации? 2: Нормальный проект весенней загрузки, который я запускаю с использованием весенней загрузки: бег. Как запустить проект с другим родительским пом?
jsosnowski
1
Приведенный выше фрагмент кода достаточен для получения функций управления зависимостями. Если вы хотите плагины (например spring-boot:run), вы должны опровергнуть их отдельно. Вы можете скопировать вставить из родительского Boot, если хотите.
Дейв Сайер
3
Я знаю, что это старая ветка, но она мне очень помогла, спасибо. В конце концов я читал об этом механизме в источнике maven.apache.org/guides/introduction/... . Это многое объясняет.
bazeusz
42

Обновление 2018-01-04 с 1.5.9. ВЫПУСК.

У меня есть полный код и пример запуска здесь https://www.surasint.com/spring-boot-with-no-parent-example/

Вам нужно это как основной

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

Но этого недостаточно, вам также нужно явно определить цель для spring-boot-maven-plugin (если вы используете Spring Boot в качестве родителя, вам не нужно явно определять это)

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

В противном случае вы не сможете создать исполняемый файл или войну.

Пока нет, если вы используете JSP, вам нужно это:

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

В противном случае вы получите это сообщение об ошибке:

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

НЕТ НЕТ, этого по-прежнему недостаточно, если вы используете Maven Profile и Resource Filter с Spring Boot с «@» вместо «$ {}» (как в этом примере https://www.surasint.com/spring-boot-maven -ресурс-фильтр / ). Тогда вам нужно явно добавить это в

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

И это в

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

Смотрите пример в ссылке https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
источник
@ Предупреждаю, мой пример 1.5.9. Вы должны использовать 1.5.11 (выпуск вчера), потому что в этой версии есть исправление серьезной проблемы безопасности.
Surasin Tancharoen
как уже упоминалось в вашем блоге, я пытался добавить плагин maven-resources-plugin, но он по-прежнему не дает мне «никакого основного атрибута манифеста в цели». Я попытался запустить
Spring
@ sagar27, какую версию вы используете 1.5.X или 2.x? если это 2.x, может потребоваться больше вещей.
Surasin Tancharoen
Спасибо !! Ты спас мне жизнь
Джи Ативат
0

Согласно ответу Surasin Tancharoen, вы также можете определить плагин maven surefire

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

и, возможно, включить отказоустойчивый плагин

    <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
источник