Spring Boot: padre pom cuando ya tienes un padre pom

184

¿Existe un enfoque específico recomendado para la inclusión del pom padre de arranque de primavera en proyectos que ya tienen un POM padre requerido?

¿Qué recomienda para los proyectos que necesitan extenderse desde un padre organizacional (esto es extremadamente común e incluso algo que muchos / la mayoría de los proyectos se publican en la central de Maven dependiendo de los repositorios de alimentadores de los que provienen)? La mayoría de las cosas de construcción están relacionadas con la creación de archivos JAR ejecutables (por ejemplo, ejecutar Tomcat / Jetty integrado). Hay formas de estructurar las cosas para que pueda obtener todas las dependencias sin extender desde un padre (similar a la composición frente a la herencia). Sin embargo, no puedes obtener un material de construcción de esa manera.

Por lo tanto, es preferible incluir todos los pom primarios de arranque dentro del POM primario requerido o simplemente tener una dependencia POM dentro del archivo POM del proyecto.

¿Otras opciones?

TIA

Scott

Scott C.
fuente

Respuestas:

179

Puede usar spring-boot-starter-parent como un "bom" (consulte Spring y Jersey otros proyectos que admiten esta característica ahora), e incluirlo solo en la sección de administración de dependencias con scope = import. De esa manera obtendrá mucho de los beneficios de usarlo (es decir, gestión de dependencias) sin reemplazar la configuración en su padre real.

Las otras dos cosas principales que hace son

  1. defina una carga de propiedades para configurar rápidamente versiones de dependencias que desea anular
  2. configurar algunos complementos con la configuración predeterminada (principalmente el complemento Spring Boot maven). Esas son las cosas que tendrá que hacer manualmente si usa su propio padre.

Ejemplo proporcionado en la documentación 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
fuente
1
Supongo que esto atrae los complementos: ¿sombra, etc.?
chrislovecnm
3
No. Lea el enlace: "aún puede mantener el beneficio de la administración de dependencias (pero no la administración de complementos)".
Dave Syer
1
@DaveSyer Por favor aclare: 1: Cuando tenga mi costumbre project-parent, podría agregar spring-boot-starter-parenta esto project-parent, ¿está bien? ¿También necesito spring-boot-dependenciesen tal situación? 2: Proyecto Spring-boot normal que ejecuto usando spring-boot: run. ¿Cómo ejecutar un proyecto con diferentes padres pom?
jsosnowski
1
El fragmento de código anterior es suficiente para obtener las funciones de administración de dependencias. Si desea complementos (como spring-boot:run), debe confutarlos por separado. Puede copiar y pegar desde el padre de arranque si lo desea.
Dave Syer
3
Sé que es un hilo viejo pero me ayudó mucho, gracias. Terminé leyendo sobre este mecanismo en la fuente maven.apache.org/guides/introduction/… . Explica mucho
bazeusz
42

Actualización 2018-01-04 con 1.5.9.

Tengo un código completo y un ejemplo ejecutable aquí https://www.surasint.com/spring-boot-with-no-parent-example/

Necesitas esto como un básico

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

Pero eso no es suficiente, también necesita definir explícitamente el objetivo de spring-boot-maven-plugin (si usa Spring Boot como padre, no tiene que definirlo explícitamente)

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

De lo contrario, no se puede construir como jar ejecutable o war.

Todavía no, si está utilizando JSP, debe tener esto:

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

De lo contrario, recibirá este mensaje de error:

    [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, esto aún no es suficiente si está utilizando el Perfil de Maven y el Filtro de recursos con Spring Boot con "@" en lugar de "$ {}" (como este ejemplo https://www.surasint.com/spring-boot-maven -resource-filter / ). Luego debe agregar explícitamente esto en

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

Y esto en

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

Vea el ejemplo en el enlace https://www.surasint.com/spring-boot-with-no-parent-example/ .

Surasin Tancharoen
fuente
@Arvind una advertencia, mi ejemplo es 1.5.9. Debería usar 1.5.11 (lanzamiento ayer) porque esta versión tiene una solución para un problema de seguridad grave.
Surasin Tancharoen
Como mencioné en su blog, traté de agregar el complemento maven-resources-plugin, pero aún así no me da "ningún atributo manifiesto principal, en target". Intenté ejecutar spring-boot: run, esto tampoco funciona :(
sagar27
@ sagar27 ¿qué versión estás utilizando 1.5.X o 2.x? si es 2.x, puede necesitar más cosas.
Surasin Tancharoen
Gracias !! Me salvaste la vida
Jey Atiwat
0

Según la respuesta de Surasin Tancharoen, es posible que también desee definir el complemento de Maven Surefire

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

y posiblemente incluya un complemento a prueba de fallas

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