¿Cómo ejecuto un programa usando Maven?


120

Me gustaría que un objetivo de Maven active la ejecución de una clase Java. Estoy tratando de migrar a través de Makefilelas líneas:

neotest:
    mvn exec:java -Dexec.mainClass="org.dhappy.test.NeoTraverse"

Y me gustaría mvn neotestproducir lo quemake neotest hace actualmente.

Ni la documentación del complemento ejecutivo ni las páginas de tareas de Maven Ant tenían ningún tipo de ejemplo sencillo.

Actualmente estoy en:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.1</version>
  <executions><execution>
    <goals><goal>java</goal></goals>
  </execution></executions>
  <configuration>
    <mainClass>org.dhappy.test.NeoTraverse</mainClass>
  </configuration>
</plugin>

Sin embargo, no sé cómo activar el complemento desde la línea de comandos.

Respuestas:


149

Con la configuración global que ha definido para exec-maven-plugin:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.4.0</version>
  <configuration>
    <mainClass>org.dhappy.test.NeoTraverse</mainClass>
  </configuration>
</plugin>

la invocación mvn exec:javaen la línea de comando invocará el complemento que está configurado para ejecutar la clase org.dhappy.test.NeoTraverse.

Entonces, para activar el complemento desde la línea de comando, simplemente ejecute:

mvn exec:java

Ahora, si desea ejecutar el exec:javaobjetivo como parte de su compilación estándar, deberá vincular el objetivo a una fase particular del ciclo de vida predeterminado . Para hacer esto, declare phaseal que desea vincular el objetivo en el executionelemento:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.4</version>
  <executions>
    <execution>
      <id>my-execution</id>
      <phase>package</phase>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>org.dhappy.test.NeoTraverse</mainClass>
  </configuration>
</plugin>

Con este ejemplo, su clase se ejecutará durante la packagefase. Este es solo un ejemplo, adáptelo a sus necesidades. Funciona también con la versión 1.1 del complemento.


1
Al principio estaba confundido: también exec:javase puede usar para el código Scala y Clojure, no tiene que ser código Java per se.
margen derecho

8
La versión debería ser 1.4.0
Walery Strauch

¡Trabajó para mi! ¡Gracias!
mrddr

25

Para ejecutar múltiples programas, también necesitaba una profilessección:

<profiles>
  <profile>
    <id>traverse</id>
    <activation>
      <property>
        <name>traverse</name>
      </property>
    </activation>
    <build>
      <plugins>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <configuration>
            <executable>java</executable>
            <arguments>
              <argument>-classpath</argument>
              <argument>org.dhappy.test.NeoTraverse</argument>
            </arguments>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

Esto luego se puede ejecutar como:

mvn exec:exec -Dtraverse

1
¿Qué pasa con esa <argument>-classpath</argument><classpath />línea? No creo que eso sea correcto.
GreenGiant

1
Sí, lo más probable es que la <classpath />etiqueta haya llegado por error y deba eliminarse. Entonces esa línea se verá solo:<argument>-classpath</argument>
Dimitry K

7
Eso no es un error. Eso indica que las dependencias especificadas en pom.xml deben usarse como parte de la ruta de clases.
user924272
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.