首先,簡單介紹Maven。Maven是管理Java項目開發的工具,不是IDE,不是編譯工具。它只是提供了一套規則和插件,說明如何對Java項目進行開發和管理。
它的規則通過POM文件說明。對於POM文件,這里不詳細介紹,只做大致介紹。我認為,POM文件大致有兩個作用,靜態描述和動態描述。第一個作用,靜態描述,即對POM文件所在的文件夾的(子)項目的介紹,比如該(子)項目的唯一標識(坐標),該子項目的依賴,該子項目的打包方式等;第二個作用,動態描述,即如何對該(子)項目進行編譯、測試、打包等,用生命周期表示。Maven提供三個生命周期以及各個生命周期階段所需的插件,可以不改直接用,也可以根據自己的需要修改。編譯、測試、打包等不是Maven實現,而是它的倉庫中提供的插件。倉庫是用來存放插件和依賴的地方。倉庫有本地、遠程倉庫。遠程倉庫又分為:2中央倉庫、 私服 和其它公共庫。這里不做詳細介紹。
這里的任務是如何將第三包依賴包加入到最終的jar可執行文件中。
對於第三方依賴(external dependency) ,有四種方式可以使用。第一種方式,在本地倉庫中添加該依賴;第二種方式:將該倉庫deploy,放在遠程倉庫,最好大家都能訪問;第三種方式:將該依賴的scope描述為system並說明絕對路徑;第四種方式:將該依賴放在程序的自建倉庫(static project repository),並在打包的時候將其將入到最終的jar。
本文主要是說明第四種方法,也比較推薦第四種方法。因為前三種方法,要么不利於最終jar文件的分發,要么比較麻煩。第四種方法,在運行的時候不需要修改或者添加java lib path。
很多時候,當某個項目需要的依賴是第三方提供的,我這類遇到的是Jcuda。由於當時在遠程倉庫還沒有Jcuda 7.5 的依賴,就需要將其作為第三方依賴來處理。在編譯的時候使用的是第三種方法,但是因為需要再另一台機器上運行,就出現問題了。網上找了很久,有兩個說的很好。
http://blog.dub.podval.org/2010/01/maven-in-project-repository.html
http://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build-classpath-without-installing-them
這兩個鏈接說明了,如何將該依賴包放在程序的lib中,該文件夾如何組織才不會出錯,路徑如何。
至於如何將該依賴的jar文件打包到最終的文件中。
第一步: 將依賴文件放到程序的repository中;
第二步:在pom.xml中指明依賴;
<dependency> <groupId>jcuda</groupId> <artifactId>jcuda</artifactId> <version>0.7.5</version> </dependency>
第三步:打包
首先需要明白,maven打包有兩種,生成一個jar包或者生成一個zip包。用maven-jar-plugin來生成jar包。使用maven-jar-plugin和maven-assembly-plugin來生成zip包。
這里,我們第二種方式。即:將應用打成一個jar包,依賴的第三方包放到lib目錄下。
首先使用maven-jar-plugin,將自己的代碼編譯為jar文件;
需要注意到是這段
<archive> <manifest> ... <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix>
... </manifest> </archive>
再使用maven-assembly-plugin,將整個項目打包為一個發布包
關於 maven-jar-plugin 和 maven-assembly-plugin 怎么寫,見 http://blog.csdn.net/cdmamata/article/details/51547033
也可以見:強烈推薦這個:
http://xxgblog.com/2015/08/07/maven-create-executable-jar/
其實,一團迷糊,說明對每個插件還不是很了解。如果對每個插件了解后,就不會有怎么多問題了。因為我只是在一個項目中多增減一個第三方依賴,因為它本來就需要對其他第三方依賴進行打包,所以我只需要完成前兩步就可以了。后面兩步,關鍵是對於幾個插件的使用說明。