Запустить основной класс проекта Maven

Я создал простую консольную Java-приложение, построенную с Maven. Есть ли способ, которым основной класс (который не требует каких-либо аргументов) может быть запущен из командной строки с помощью команды maven, например:

mvn run-app com.example.MainClass

Ответ 1

Попробуйте maven-exec-plugin. Оттуда:

mvn exec:java -Dexec.mainClass="com.example.Main"

Это приведет к запуску вашего класса в JVM. Вы можете использовать -Dexec.args="arg0 arg1" для передачи аргументов.

Если вы используете Windows, примените кавычки для exec.mainClass и exec.args:

mvn exec:java -D"exec.mainClass"="com.example.Main"

Если вы делаете это регулярно, вы можете добавить параметры в файл pom.xml:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <executions>
    <execution>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <mainClass>com.example.Main</mainClass>
    <arguments>
      <argument>foo</argument>
      <argument>bar</argument>
    </arguments>
  </configuration>
</plugin>

Ответ 2

Хотя maven exec делает трюк здесь, я нашел его довольно слабым для реального теста. В ожидании оболочки maven и надеясь, что это может помочь другим, я, наконец, вышел на это репо mvnexec

Клонировать его и сопоставить script где-то на вашем пути. Я использую ~/bin/mvnexec, так как у меня есть ~/bin на моем пути. Я думаю, что mvnexec является хорошим именем для script, но зависит от вас, чтобы изменить символическую ссылку...

Запустите его из корня вашего проекта, где вы можете увидеть src и target dirs.

script найдите классы с основным методом, предложив выбрать один из них (пример с mavenized JMeld)

$ mvnexec 
 1) org.jmeld.ui.JMeldComponent
 2) org.jmeld.ui.text.FileDocument
 3) org.jmeld.JMeld
 4) org.jmeld.util.UIDefaultsPrint
 5) org.jmeld.util.PrintProperties
 6) org.jmeld.util.file.DirectoryDiff
 7) org.jmeld.util.file.VersionControlDiff
 8) org.jmeld.vc.svn.InfoCmd
 9) org.jmeld.vc.svn.DiffCmd
10) org.jmeld.vc.svn.BlameCmd
11) org.jmeld.vc.svn.LogCmd
12) org.jmeld.vc.svn.CatCmd
13) org.jmeld.vc.svn.StatusCmd
14) org.jmeld.vc.git.StatusCmd
15) org.jmeld.vc.hg.StatusCmd
16) org.jmeld.vc.bzr.StatusCmd
17) org.jmeld.Main
18) org.apache.commons.jrcs.tools.JDiff
#? 

Если выбран один (ввод номера), вы запрашиваете аргументы (вы можете избежать с помощью mvnexec -P)

По умолчанию он компилирует каждый проект проекта. но вы можете избежать этого, используя mvnexec -B

Он позволяет искать только в тестовых классах -M или --no-main или только в основных классах -T или --no-test. также имеет фильтр по имени -f <whatever>

Надеюсь, это может сэкономить вам некоторое время, для меня это так.