2011-05-16 67 views
10

我是java和maven的全新品牌,所以這可能非常簡單。如何使用maven打包並運行帶有依賴關係的簡單命令行應用程序?

如果我按照maven2的hello world說明操作:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

一切正常確定。如果我然後更改pom.xml以從遠程存儲庫引入依賴項,則此依賴項的文件將存儲在~/.m2/repository/new-dependency/中。

使用在hello world指令以運行該應用程序的語法要求我添加到我的類路徑的依賴性的絕對路徑(或者通過設置環境變量或通過命令行開關):

java -cp target/my-app-1.0-SNAPSHOT.jar:/.../.m2/.../new-dependency.jar com.mycompany.app.App 

這顯然會很快變得笨拙:)

我懷疑這不是通常的運行java程序的方式,我只需要閱讀更多關於.jar文件,但是當我這樣做時,我會很感激任何提示如何正確地做到這一點。

我沒有使用IDE,順便說一句。 vim從命令行。

謝謝!

Mike。

回答

9

可以通過將Main-Class屬性添加到其清單文件來製作jar可執行文件。在Maven中,這由歸檔插件完成。要添加Main-Class屬性,添加到您的pom.xml:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId>   
     <configuration> 
     <archive> 
      <manifest> 
      <addClasspath>true</addClasspath> 
      <mainClass>com.mycompany.app.App</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

您現在可以運行帶有命令你的罐子:java -jar myjar.jar或雙擊它(在所有平臺上不能使用)。

+0

經過一些修改之後,它才起作用: – mdtsandman 2011-05-17 00:29:01

+2

爲了使這個解決方案能夠工作,我需要將classpathMavenRepositoryLayout = true和classpathPrefix =/home /.../.m2/repository/添加到清單部分,因爲默認行爲就是將清單中jar的名稱(不參考它在文件系統中的位置)。 – mdtsandman 2011-05-17 00:38:45

+0

是的,默認行爲期望依賴位於主jar的同一目錄中。由於您有本地回購的依賴關係,所以您的解決方案可以從系統中的任何位置運行該jar。 – iruediger 2011-05-17 01:38:37

12

您可以使用maven本身來運行它,我相信它會爲您設置類路徑。

mvn compile 

將編譯 然後運行:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App" 

將執行它。

你可以看到http://www.vineetmanohar.com/2009/11/3-ways-to-run-java-main-from-maven/上的方式來運行(包括通過命令行參數傳遞給要運行的東西)

+0

這也適用。特別感謝鏈接! – mdtsandman 2011-05-16 23:55:32

2

你可以使用maven-shade-plugin這將創建一個可執行的與所有依賴關係的超級戰爭。

OR

使用它創建一個導入所有的依賴,讓你在命令行中執行主類的腳本appassembler-plugin

+0

我沒有嘗試陰影插件,但appassembler爲我工作。謝謝! – mdtsandman 2011-05-16 23:57:58

相關問題