Como executo um programa usando o Maven?

120

Eu gostaria que um objetivo do Maven acione a execução de uma classe java. Estou tentando migrar Makefilecom as linhas:

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

E eu gostaria mvn neotestde produzir o que make neotestfaz atualmente.

Nem a documentação do plugin exec nem as páginas de tarefas do Maven Ant tinham qualquer tipo de exemplo direto.

Atualmente, estou em:

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

Não sei como acionar o plugin na linha de comando, no entanto.

Vai
fonte

Respostas:

149

Com a configuração global que você definiu para o plugin exec-maven:

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

invocar mvn exec:javana linha de comando invocará o plugin que está configurado para executar a classe org.dhappy.test.NeoTraverse.

Portanto, para acionar o plug-in a partir da linha de comando, basta executar:

mvn exec:java

Agora, se você quiser executar a exec:javameta como parte de sua construção padrão, precisará vincular a meta a uma fase específica do ciclo de vida padrão . Para fazer isso, declare o phaseao qual deseja vincular a meta no 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>

Com este exemplo, sua aula seria executada durante a packagefase. Este é apenas um exemplo, adapte-o às suas necessidades. Funciona também com o plugin versão 1.1.

Pascal Thivent
fonte
1
Fiquei confuso no início: exec:javapode ser usado para código Scala e Clojure também, não precisa ser código Java em si.
direita
8
A versão deve ser 1.4.0
Walery Strauch
Funcionou para mim! THX!
mrddr
25

Para executar vários programas, também precisava de uma profilesseção:

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

Isso é então executável como:

mvn exec:exec -Dtraverse
Vai
fonte
1
O que está acontecendo com essa <argument>-classpath</argument><classpath />linha? Eu não acho isso correto.
GreenGiant
1
Sim, provavelmente a <classpath />tag chegou lá por engano e deve ser removida. Portanto, essa linha será apenas:<argument>-classpath</argument>
Dimitry K
7
Isso não é um erro. Isso indica que as dependências especificadas no pom.xml devem ser usadas como parte do caminho da classe.
user924272