有没有一种方法可以使用maven来运行可执行jar?

我有一个multimodule maven项目,其中一个模块用于分发。

Project \ | moduleA \ | moduleB \ | ... | dist-module \ 

该发行版包含一个我想轻松执行的可执行jar。 但是,为了执行它,我必须键入类似于:

 java -jar dist-module/target/dist-module-1.0-SNAPSHOT-full-dist/myJar.jar 

简单地键入:

 mvn exec:java \ OR mvn exec:exec 

不幸的是,我找不到让java目标执行.jar的方法。 exec的目标实际上是这样做的,但是有一个问题:jar包含一个嵌入式jetty服务器,并且由于exec的工作方式(不使用与maven相同的JVM),服务器不会终止,除非我终止进程手动,这同样令人烦恼。

有关如何使用maven执行此操作的任何建议?

编辑:
为了澄清,该命令主要用于简单的手动烟雾测试; 读取日志输出并确保程序在其分发环境中正确启动。 因此,它应该是一个阻塞调用,ctrl-c终止服务器和maven。

嵌入式服务器专门用于运行一些特定的应用程序,并不会自动重新加载它们。 因此,不需要长时间独立于maven运行服务器。

mvn exec:java直接从目标/下面的编译器输出运行应用程序 – 无需从jar运行:

   org.codehaus.mojo exec-maven-plugin 1.2.1   default-cli  java   uk.co.pookey.hibernate.App   derby.stream.error.file ${basedir}/target/derby.log       

如果你想用mvn exec运行jar:exec:

   org.codehaus.mojo exec-maven-plugin 1.2.1   default-cli  exec   java  /tmp  -jar ${basedir}/target/hibernate-derby-memory-${project.version}.jar      

如果您遇到jetty终止问题,我建议运行集成测试(或者不要先退出jetty主线程而不先终止jetty,或者只使用jetty的stop port)! 可以在后台运行JVM,让maven在测试后再次停止它。 这有三个阶段:预集成测试,集成测试或集成后测试。 您可以在http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing上阅读更多相关信息。 使用jetty maven插件时,pom.xml配置可能会:

   org.mortbay.jetty jetty-maven-plugin    start-jetty pre-integration-test  deploy-war   true   some.prop false      stop-jetty post-integration-test  stop     

您可以绑定maven antrun插件来执行任意命令,而不是将jetty maven插件绑定到这些阶段。

如果你想执行东西,我会使用maven ant或gmaven(然后使用groovy ant builder)

编辑后听起来像你使用DropWizard之类的东西。 您可能想看看他们是如何解决这个问题的 。

根据评论进行编辑:

Spring Boot Maven将创建可执行的战争并执行它们,你不需要Spring Boot和Spring。 我在这里回答的更多细节: spring-boot-maven-plugin可用于非弹簧项目吗?