Comment exécuter un programme avec Maven?

120

J'aimerais qu'un objectif Maven déclenche l'exécution d'une classe java. J'essaye de migrer sur un Makefileavec les lignes:

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

Et j'aimerais mvn neotestproduire ce que make neotestfait actuellement.

Ni la documentation du plugin exec ni les pages de tâches de Maven Ant ne contenaient d'exemple simple.

Actuellement, je suis à:

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

Cependant, je ne sais pas comment déclencher le plugin depuis la ligne de commande.

Volonté
la source

Réponses:

149

Avec la configuration globale que vous avez définie pour 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>

l'invocation mvn exec:javasur la ligne de commande appellera le plugin qui est configuré pour exécuter la classe org.dhappy.test.NeoTraverse.

Donc, pour déclencher le plugin à partir de la ligne de commande, exécutez simplement:

mvn exec:java

Désormais, si vous souhaitez exécuter l' exec:javaobjectif dans le cadre de votre build standard, vous devrez lier l'objectif à une phase particulière du cycle de vie par défaut . Pour ce faire, déclarez le phaseauquel vous souhaitez lier l'objectif dans l' executionélément:

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

Avec cet exemple, votre classe serait exécutée pendant la packagephase. Ceci n'est qu'un exemple, adaptez-le à vos besoins. Fonctionne également avec la version 1.1 du plugin.

Pascal Thivent
la source
1
J'étais confus au début: exec:javapeut être utilisé pour le code Scala et Clojure également, il n'est pas nécessaire que ce soit du code Java en soi.
rightfold
8
La version devrait être 1.4.0
Walery Strauch
A travaillé pour moi! THX!
mrddr le
25

Afin d'exécuter plusieurs programmes, j'avais également besoin d'une profilessection:

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

Ceci est alors exécutable comme:

mvn exec:exec -Dtraverse
Volonté
la source
1
Que se passe-t-il avec cette <argument>-classpath</argument><classpath />ligne? Je ne pense pas que ce soit correct.
GreenGiant
1
Oui, la <classpath />balise est probablement arrivée par erreur et devrait être supprimée. Donc, cette ligne aura l'air juste:<argument>-classpath</argument>
Dimitry K
7
Ce n'est pas une erreur. Cela indique que les dépendances spécifiées dans le pom.xml doivent être utilisées dans le cadre du chemin de classe.
user924272