plugin - Maven exec: objetivo de Java en un proyecto de varios módulos
maven execute command (3)
Las metas en un proyecto de múltiples módulos, cuando se ejecutan desde el padre, se ejecutarán en todos los módulos. No creo que sea eso lo que quieres. Puedes probar:
mvn exec:java -pl module2 -Dexec.mainClass=MyMain
¿Aquello podría funcionar? Más información:
Sin embargo, creo que es más intuitivo cambiar el directorio al submódulo que contiene el ejecutable antes de ejecutarlo.
Estoy intentando ejecutar exec-maven-plugin
''s exec:java
goal en un proyecto simple de dos módulos donde un módulo depende del otro. Hasta ahora no puedo encontrar una configuración que funcione. Aquí hay un caso de prueba reducido:
- exec-multi-module-test /
- pom.xml
- módulo 1/
- pom.xml
- src /
- principal/
- Java/
- HelloPrinter.java
- Java/
- principal/
- módulo2 /
- pom.xml
- src /
- principal/
- Java/
- MyMain.java
- Java/
- principal/
Aquí está el padre pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkscrg.sandbox</groupId>
<artifactId>exec-multi-module-test</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>module1</module>
<module>module2</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
</plugin>
</plugins>
</build>
</project>
pom del module1
1:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>exec-multi-module-test</artifactId>
<groupId>com.mkscrg.sandbox</groupId>
<version>1.0</version>
</parent>
<artifactId>module1</artifactId>
</project>
pom del module2
: http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0
<parent>
<artifactId>exec-multi-module-test</artifactId>
<groupId>com.mkscrg.sandbox</groupId>
<version>1.0</version>
</parent>
<artifactId>module2</artifactId>
<dependencies>
<dependency>
<groupId>com.mkscrg.sandbox</groupId>
<artifactId>module1</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
Este proyecto compila con éxito desde la parte superior, pero ejecuta mvn exec:java -Dexec.mainClass=myMain
falla:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] exec-multi-module-test
[INFO] module1
[INFO] module2
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building exec-multi-module-test 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ exec-multi-module-test ---
[WARNING]
java.lang.ClassNotFoundException: MyMain
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
at java.lang.Thread.run(Thread.java:680)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] exec-multi-module-test ............................ FAILURE [0.363s]
[INFO] module1 ........................................... SKIPPED
[INFO] module2 ........................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.566s
[INFO] Finished at: Mon Jun 18 14:11:54 PDT 2012
[INFO] Final Memory: 3M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:java (default-cli) on project exec-multi-module-test: An exception occured while executing the Java class. MyMain -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
¿Cuál es la forma correcta de configurar este proyecto para permitir que exec:java
vea MyMain
?
EDITAR: Aquí hay una esencia si quieres probar esto tú mismo: https://gist.github.com/2950830
EDITAR: Aclaración: sé que es posible mvn install
y luego ejecutar exec:java
desde el directorio del -pl
o usar el indicador -pl
desde la parte superior. Sin embargo, me gustaría evitar ejecutar mvn install
. No debería ser necesario modificar mi repositorio local para ejecutar este objetivo en un proyecto de varios módulos. Del mismo modo que mvn compile
"simplemente funciona" con un proyecto de varios módulos, también lo deberían hacer otros objetivos / fases.
Vea esta respuesta para una alternativa de comando único sin mvn install
:
https://.com/a/26448447/1235281
Al usar skip
en el pom.xml
padre, puede decirle a Maven que solo ejecute exec:java
en un submódulo específico.
- Debe vincular el
exec-maven-plugin
a un objetivo del ciclo de vida de maven, por ejemplo,verify
. - Dado que desea que el complemento se ejecute solo para el
module
2, defina las configuraciones del complemento en el pom padre dentro depluginManagement
. Use el mismo solo en elmodule 2
. - Luego ejecuta lo siguiente:
mvn verify -Dexec.mainClass=MyMain
.
padre pom
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
módulo 2
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
</plugin>
</plugins>
</build>