que proyecto mvn estructura ejemplo crear conceptos comandos clean basicos maven maven-2

proyecto - group id maven



Ejecución de un objetivo de complemento Maven específico desde la línea de comando en un submódulo de un proyecto de reactor de varios módulos (4)

Tengo un proyecto de varios módulos y me gustaría ejecutar el complemento exec:java desde la línea de comandos contra uno de los submódulos de mi proyecto.

No digo que esto se ajuste a su caso de uso exacto, pero es posible ejecutar un objetivo en un subconjunto de una compilación de varios módulos utilizando la -pl, --projects <arg> :

mvn exec:java -pl my-module

Sé que un enfoque es que puedo ejecutar "mvn install" en todo el proyecto y luego ir al directorio del submódulo, ejecutar el comando exec: java desde la línea de comandos y tener los artefactos resueltos en mi repositorio local.

La resolución de dependencia se realiza a través del repositorio local.

Lo que realmente me gustaría es la capacidad de ejecutar exec:java contra el reactor Maven, donde el classpath se construye a partir de los módulos activos del proyecto en el reactor Maven.

Eso no es realmente lo que hace una construcción de reactor. Una construcción de reactor construye un gráfico orientado de los módulos, deriva un orden de construcción apropiado de este gráfico y ejecuta el objetivo / fase contra los módulos en el orden calculado. Una construcción de reactor no construye un classpath "global".

Un enfoque ingenuo es ejecutar el objetivo de exec:java desde la raíz del proyecto, pero esto intenta ejecutar el complemento contra cada módulo en el proyecto, a diferencia del módulo de destino que me interesa.

Bueno, este es el comportamiento esperado. Simplemente no parece ser lo que realmente estás buscando.

¿Alguna idea? Sé que mi ejemplo motivador fue el ejecutivo: java, pero en realidad hay una serie de objetivos de complemento único que me gustaría ejecutar contra mi proyecto de vez en cuando fuera del alcance del ciclo de vida de compilación completo

La construcción de un reactor permite esto, pero, como escribí, pareces estar buscando algo diferente. Tal vez si aclaras tu necesidad exacta, podría darte una mejor respuesta.

Estoy buscando una técnica general aquí, pero demos un ejemplo específico. Tengo un proyecto de varios módulos y me gustaría ejecutar el objetivo exec:java desde la línea de comandos contra uno de los submódulos de mi proyecto.

Sé que un enfoque es que puedo ejecutar mvn install en todo el proyecto y luego ir al directorio del submódulo, ejecutar el comando exec:java desde la línea de comandos y tener los artefactos resueltos en mi repositorio local. Pero ejecutar mvn install todo el tiempo se vuelve bastante tedioso.

Lo que realmente me gustaría es la capacidad de ejecutar exec:java contra el reactor Maven, donde el classpath se construye a partir de los módulos activos del proyecto en el reactor Maven. El problema es que no estoy seguro de que esto sea posible. Un enfoque ingenuo es ejecutar el objetivo de exec:java desde la raíz del proyecto, pero esto intenta ejecutar el complemento contra cada módulo en el proyecto, a diferencia del módulo de destino que me interesa.

¿Alguna idea? Sé que mi ejemplo motivador fue exec:java , pero en realidad hay una serie de objetivos de complemento único que me gustaría ejecutar contra mi proyecto de vez en cuando fuera del alcance del ciclo de vida de compilación completo.


Hay otra manera que le permite elegir múltiples módulos para ejecutar un complemento.

Muchos complementos tienen una opción de skip , que puede activar en el proyecto raíz estableciendo su valor en true . La ejecución del complemento se omitirá de forma predeterminada para todos los submódulos. Los submódulos que deben ejecutar el complemento pueden establecer explícitamente skip a false . Aún necesita configurar los atributos no opcionales en el proyecto raíz.

Ejemplo del exec-maven-plugin con configuración para el objetivo exec:exec :

<!-- root project --> <build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <skip>true</skip> <executable>java</executable> </configuration> </plugin> </plugins> </pluginManagement> </build>

<!-- any module that should execute the plugin --> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <skip>false</skip> <!-- ... --> </configuration> </plugin> </plugins> </build>


La sugerencia de Pascal es probablemente lo que quieres. Tenga en cuenta que actualmente no es posible compilar primero las dependencias, luego ejecutar ( exec:exec etc.) la aplicación, en un solo comando Maven: https://jira.codehaus.org/browse/MNG-5059


Una técnica algo general que he usado en esta circunstancia es definir un perfil en el submódulo POM en cuestión que vincula a exec: java con la fase de prueba. Por ejemplo:

<profiles> <profile> <id>test-java</id> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.1.1</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>com.foo.bar.MyClass</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>

Luego, desde la parte superior de su proyecto, ejecute:

mvn test -Ptest-java

Esto configurará la ruta de clase entre módulos como de costumbre e intentará ejecutar el perfil de prueba-java en todos sus subproyectos. Pero dado que solo el que te importa tiene el perfil definido, es el único que hará cualquier cosa.

Le toma un poquito de tiempo extra a Maven repasar sus otros subproyectos NOOPing, pero no es tan malo.

Una cosa a tener en cuenta es que el subproyecto se ejecuta con el directorio de nivel superior como el directorio de trabajo actual (no el directorio del subproyecto). No hay mucho que pueda hacer para evitarlo, pero con suerte eso no le causará problemas.