¿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.

Será
fuente

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.

Pascal Thivent
fuente
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
Será
fuente
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