288

我创建了一个使用 Maven 构建的简单控制台 Java 应用程序。有没有一种方法可以使用 maven 命令从命令行运行主类(不需要任何参数),例如:

mvn run-app com.example.MainClass
4

2 回答 2

588

试试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>
于 2012-03-23T20:28:29.903 回答
16

尽管 maven exec 在这里做了诀窍,但我发现它对于真正的测试来说非常糟糕。在等待maven shell并希望这对其他人有所帮助时,我终于来到了这个 repo mvnexec

克隆它,并将脚本符号链接到路径中的某个位置。我使用~/bin/mvnexec,就像我~/bin在路上一样。我认为mvnexec是脚本的好名字,但要由您来更改符号链接...

从项目的根目录启动它,您可以在其中看到 src 和目标目录。

脚本搜索具有 main 方法的类,提供选择一个选项(使用 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>

希望这可以为您节省一些时间,对我来说确实如此。

于 2012-03-29T09:40:04.853 回答