2012-06-18 13 views
28

Estoy tratando de ejecutar el objetivo exec-maven-plugin de exec:java 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. He aquí un caso de prueba hacia abajo hervida:Ejecución de Maven: objetivo de Java en un proyecto de varios módulos

  • -multi-módulo de prueba exec/
    • pom.xml
    • módulo 1/
      • pom.xml
      • src/
        • main/
          • java/
            • HelloPrinter.java
    • Module2/
      • pom.xml
      • src/
        • principal/
          • java/
            • MyMain.java

Aquí está el pom padres:

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

module1 's 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> 

    <parent> 
     <artifactId>exec-multi-module-test</artifactId> 
     <groupId>com.mkscrg.sandbox</groupId> 
     <version>1.0</version> 
    </parent> 

    <artifactId>module1</artifactId> 
</project> 

module2' s pom: 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 se compila correctamente desde la parte superior, pero el funcionamiento 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 manera correcta de configurar este proyecto para permitir exec:java a ver MyMain?

EDIT: Aquí hay una esencia si desea ensayar lo siguiente: https://gist.github.com/2950830

EDIT: Aclaración: Sé que es posible mvn install y luego o bien ejecutar exec:java del directorio module2 's o usar la bandera -pl de 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. Así como mvn compile "simplemente funciona" con un proyecto de varios módulos, también lo deberían hacer otros objetivos/fases.

Respuesta

23

Las metas en un proyecto de varios módulos, cuando se ejecutan desde el elemento principal, se ejecutarán en todos los módulos. No creo que sea eso lo que quieres. Puede probar:

mvn exec:java -pl module2 -Dexec.mainClass=MyMain 

Eso podría funcionar? Más información:

Sin embargo, creo que es más intuitivo para cambiar de directorio a la sub-módulo que contiene el ejecutable antes de ejecutarlo.

+5

Este (y 'cd'ing al submódulo) sólo funcionan si se ha de ejecutar' install' mvn desde la parte superior. De lo contrario, falla porque no puede encontrar 'module1' en ningún repositorio. 'mvn compile' resuelve satisfactoriamente los módulos aunque no estén instalados en el repositorio local. Estoy buscando una forma de obtener ese comportamiento con 'mvn exec: java'. –

+0

Perdón por la confusión; Agregué una aclaración en la pregunta. –

+0

No creo que sea posible ejecutar exec: java sin instalar a menos que se invoque el reactor maven. Para complicar el problema, cuando se ejecuta desde el POM padre, no hay dependencias, por lo que exec: java no puede encontrar la clase principal (mucho menos cualquier dependencia). Y cuando se ejecuta desde el submódulo, la resolución padre/hermano no lo hace no se lleva a cabo.Probé varias ideas, pero la única que funcionó fue la respuesta de @Raghuram para enlazar a un objetivo del ciclo de vida. – kaliatech

8
  • Usted debe obligar a la exec-maven-plugin a un gol experto ciclo de vida, por ejemplo verify.
  • Dado que desea que el complemento se ejecute solo para module 2, defina las configuraciones del complemento en el pom principal dentro de pluginManagement. Use el mismo solo en module 2.
  • A continuación, ejecute lo siguiente:

mvn verify -Dexec.mainClass=MyMain.

pom padres

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

He verificado esto funciona. ¡Guay! ¿Sería más limpio utilizar un perfil especial para configurar este objetivo solo cuando se ejecuta exec: java? De lo contrario, el ejecutivo se invocará en cualquier actividad que pase por el ciclo de vida de verificación. – kaliatech

+0

@kaliatech. Sí, de hecho, según el requisito. – Raghuram

+1

@ Raghuram - Intenté esta solución, y funciona muy bien para ejecutar la fase de verificación. Sin embargo, cuando intento ejecutar 'mvn exec: java' maven arroja una excepción diciéndome que el parámetro 'mainClass' falta para el proyecto padre (en lugar de solo tratar de encontrar el mainclass para el proyecto hijo). ¿Alguna idea de lo que hice mal? – Tiddo

Cuestiones relacionadas