2013-03-01 101 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

相關問題