run plugin mvn java maven exec-maven-plugin

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
    • módulo2 /
      • pom.xml
      • src /
        • principal/
          • Java/
            • MyMain.java

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.

GitHub: https://github.com/Oduig/mavenfiddle


  • 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 de pluginManagement . Use el mismo solo en el module 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>