Как выполнить программу с помощью Maven?

120

Я хотел бы, чтобы цель Maven запускала выполнение класса java. Я пытаюсь перейти на следующие Makefileстроки:

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

И я хотел бы mvn neotestпроизводить то, что make neotestесть сейчас.

Ни в документации к плагину exec, ни на страницах задач Maven Ant не было никаких простых примеров.

В настоящее время я нахожусь в:

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

Однако я не знаю, как запустить плагин из командной строки.

Будет
источник

Ответы:

149

С глобальной конфигурацией, которую вы определили для плагина 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>

вызов mvn exec:javaиз командной строки вызовет плагин, настроенный для выполнения класса org.dhappy.test.NeoTraverse.

Итак, чтобы запустить плагин из командной строки, просто запустите:

mvn exec:java

Теперь, если вы хотите выполнить exec:javaцель как часть стандартной сборки, вам нужно привязать цель к определенной фазе жизненного цикла по умолчанию . Для этого объявите phaseв executionэлементе, к которому вы хотите привязать цель :

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

В этом примере ваш класс будет выполняться во время packageфазы. Это всего лишь пример, адаптируйте его под свои нужды. Также работает с плагином версии 1.1.

Паскаль Тивент
источник
1
Сначала я был сбит с толку: exec:javaможет использоваться и для кода Scala и Clojure, это не обязательно должен быть код Java как таковой.
правый фолд
8
Версия должна быть 1.4.0
Валери Штраух
Сработало у меня! Спасибо!
mrddr
25

Для выполнения нескольких программ мне также понадобился profilesраздел:

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

Затем он исполняется как:

mvn exec:exec -Ptraverse
Будет
источник
1
Что происходит с этой <argument>-classpath</argument><classpath />линией? Я не думаю, что это правильно.
GreenGiant 02 окт.13,
1
Да, скорее всего, <classpath />тег попал туда по ошибке и его нужно удалить. Так что эта строка будет выглядеть просто:<argument>-classpath</argument>
Дмитрий К
7
Это не ошибка. Это означает, что зависимости, указанные в pom.xml, следует использовать как часть пути к классу.
user924272