2013-03-01 55 views
13

我有一个multimodule maven项目,其中一个模块用于分发。有没有一种使用maven来运行可执行jar的好方法?

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运行。

+0

码头的任务是什么? – Nachtgold 2013-03-04 11:52:38

+0

你可以附加有问题的exec:java目标定义吗? – 2013-03-05 12:08:10

+0

没有好的方法,因为maven是一个构建和部署工具。如果你的jar是构建过程的一部分,那么为它写一个maven插件。如果你只是想用maven来运行你的应用程序,也许最好还是去想其他的东西。 – kan 2013-03-06 11:53:27

回答

25

MVN高管:JAVA直接从编译器输出低于目标/运行的应用程序 - 不需要从罐子里运行:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>java</goal> 
       </goals> 
       <configuration> 
        <mainClass>uk.co.pookey.hibernate.App</mainClass> 
        <systemProperties> 
         <systemProperty> 
          <key>derby.stream.error.file</key> 
          <value>${basedir}/target/derby.log</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin>    

如果你想运行jar与MVN EXEC:EXEC:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>exec</goal> 
       </goals> 
       <configuration> 
        <executable>java</executable> 
        <!-- optional --> 
        <workingDirectory>/tmp</workingDirectory> 
        <arguments> 
         <argument>-jar</argument> 
         <argument>${basedir}/target/hibernate-derby-memory-${project.version}.jar</argument> 
        </arguments> 
       </configuration>       
      </execution> 
     </executions> 
    </plugin>   

如果你有码头终止的问题,我建议你运行的集成测试(或只是没有第一终止码头不退出码头主线程,或者只是使用码头的停止港口)!可以在后台运行JVM,并让Maven在测试后再次停止。这有三个阶段:预集成测试,集成测试或后集成测试。你可以在http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing阅读更多关于此。当使用码头Maven插件,在pom.xml的配置可能喜欢:

<plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <!-- test start/stop: --> 
     <executions>     
      <execution> 
       <id>start-jetty</id> 
       <phase>pre-integration-test</phase> 
       <goals> 
        <goal>deploy-war</goal> 
       </goals> 
       <configuration> 
        <daemon>true</daemon> 
        <systemProperties> 
         <systemProperty> 
          <name>some.prop</name> 
          <value>false</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
      <execution> 
       <id>stop-jetty</id> 
       <phase>post-integration-test</phase> 
       <goals> 
        <goal>stop</goal> 
       </goals> 
      </execution> 
     </executions>  
    </plugin> 

而是结合码头Maven插件到这些阶段,你可以绑定行家antrun插件来执行任意命令。

+0

我需要运行该jar,因为它包含标识其路径并指定同一目录中的其他资源的逻辑。因此,它实际上是需要执行代码的分发项目。然而,使用maven进行集成测试是一个值得探索的有趣的可能性,所以至少+1。 – Shaun 2013-03-08 12:31:43

+0

看起来你正在重新发明车轮。如果你需要正确的发行版,考虑使用war文件和可能的tanukisoft包装器在生产环境中运行它们 - 如果你不想使用像tomcat和jetty这样的整个应用服务器就足够了。 tanukisoft包装器启动一个码头应用程序服务器,并从解压后的分发档案库运行您的web应用程序。如果您需要示例,请查看Archiva的源代码。如果你需要帮助,我之前就已经这样做了......而且在使用war文件时,你可以使用我提到的jetty-integration示例。 – user1050755 2013-03-09 08:43:29

+0

如果你有一个精简版的服务器项目,我可以试试看。不应该太复杂。但我从来没有设法通过编程方式设置jetty webapps :-) – user1050755 2013-03-09 08:52:00

3

我会使用maven蚂蚁或gmaven(然后使用Groovy Ant构建),如果你想执行的东西

听起来你使用类似DropWizard喜欢你的编辑之后。你可能想看看他们是如何的solving that problem

编辑基于评论:

春季启动Maven将创建可执行的战争以及执行它们,你不需要启动春春也。在我的答案在这里更多的细节:Can spring-boot-maven-plugin be used for non spring project?

+0

虽然我觉得user1050755的回答更直接地解决了这个问题,但是我感谢您将DropWizard引入我的注意。它不太适合我的项目需求,但它足够类似于做一个有趣的案例研究。 – Shaun 2013-03-11 16:01:22

+0

这个答案中的两个链接在撰写本文时已经死亡。 – Stephan 2017-07-14 17:59:06

+0

@Stephan其实我现在推荐的最好的选择是Spring Boot maven插件,它偶尔不需要Spring Boot甚至Spring。看到我的答案在这里:https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 – 2017-07-17 17:43:01

相关问题