java - instalar - Aumentar en lugar de anular la configuración de Maven
maven download (2)
Esto fue explicado en una entrada de blog por Sonatype.
En el pom padre, especifique
<configuration>
<aspectLibraries combine.children="append">
<aspectLibrary>
<groupId>name.seller.rich</groupId>
<artifactId>tracing</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
En general, los elementos de configuración de los hijos anularán los especificados en el padre para cualquier complemento dado. Esto mantiene las cosas simples por defecto: un niño totalmente configurado usaría exactamente la configuración en su pom. Sin embargo, el padre puede imponer que las listas deben extenderse en lugar de reemplazarse utilizando la configuración combine.children = "append" en los elementos de configuración deseados.
Vi esta pregunta y me motivó a volver a mirar (sin éxito) las configuraciones de Maven para una forma alternativa de declarar la configuración, de modo que se adjunte a la configuración del POM principal en lugar de anularla. En un POM de Maven, si la configuración declara los mismos elementos que en el padre, anula la configuración del padre. Como dice la respuesta aceptada a la otra pregunta, este es el comportamiento esperado .
Pero este no es siempre el comportamiento deseado . ¿Debería haber / hay medios en Maven para agregar en lugar de anular la configuración?
Por ejemplo: - ¿Proporciona la capacidad de declarar elementos de la configuración final, de modo que los niños puedan agregarles pero no reemplazar? - Permitir que la configuración secundaria declare un elemento como una adición, por lo que se fusiona con el padre
Un buen ejemplo de cuando el comportamiento de anulación no siempre es deseable es el elemento aspectLibraries del aspectj-maven-plugin.
En mi POM principal, defino una configuración para el complemento aspectj que declara que un frasco de rastreo se usará como una biblioteca de aspecto.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<executions>
<execution>
<id>compile_with_aspectj</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<aspectLibraries>
<aspectLibrary>
<groupId>name.seller.rich</groupId>
<artifactId>tracing</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<dependencies>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
</plugin>
Esto lo heredan todos los proyectos secundarios y obtengo un seguimiento en todos los proyectos, lo cual es bueno. Sin embargo, si defino otra biblioteca de aspecto en un POM secundario, reemplaza mi configuración de seguimiento.
Tenga en cuenta que tengo una solución a este problema en particular, estoy interesado en el caso general y las implicaciones para Maven.
La respuesta simple sería redeclarar la configuración para el jar de rastreo en el POM secundario así como el nuevo jar, pero esto tiene implicaciones de mantenimiento, y si quiero declarar la configuración de rastreo en un perfil para que se pueda desactivar si es necesario ( que hago), entonces necesito volver a implementar el perfil en el niño.
La declaración de dependencia en el ejemplo anterior se combina con otras declaraciones de dependencia en el padre y en otros lugares. Sé que las dependencias son un caso especial, pero muestra que es factible implementarlas.
Necesito probar esto, así que permítame hablar con usted sobre esto, pero creo que la forma correcta de hacerlo es usar las properties , como se indica here . En su caso el código se vería de la siguiente manera:
<properties>
<aspect.library.groupId>name.seller.rich</aspect.library.groupId>
<aspect.library.artifactId>tracing</aspect.library.artifactId>
</properties>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<executions>
<execution>
<id>compile_with_aspectj</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<aspectLibraries>
<aspectLibrary>
<groupId>${aspect.library.groupId}</groupId>
<artifactId>${aspect.library.artifactId}</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<dependencies>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
</plugin>
Luego, en el hijo podrá cambiar esas propiedades y el padre recogerá automáticamente los nuevos valores:
<properties>
<aspect.library.groupId>name.seller.rich</aspect.library.groupId>
<aspect.library.artifactId>something-else</aspect.library.artifactId>
</properties>
Sin embargo, creo que puede estar solicitando la capacidad de agregar la configuración para tener un nodo adicional en la configuración de su hijo encima del especificado en su padre. Para ese caso no puedo pensar en una solución obvia.