用maven assembly外掛打jar包實現依賴包歸檔
我知道pom型別如果是war的話,在使用mvn package 的命令就能自動將專案依賴的jar包打到web-inf 下的lib資料夾中。但是,如果pom型別為jar的話,當你呼叫mvn package命令,執行過程中不會將依賴的第三方包提取出來。
以前,我的做法是,等到專案要上線的時候將pom型別改成war,然後執行一下mvn package命令,這樣先把所以依賴到的包提取出來,然後再把pom型別改成jar,這樣雖然能完成任務,但是,總感覺這樣的做法比較拙劣。
所以最近尋找了一下有沒有更好的辦法,其實很簡單,就是使用 maven的 assembly外掛,在pom.xml 新增如下外掛:
[xhtml]- <project>
- [...]
- <build>
- [...]
- <plugins>
- <plugin>
- <!-- NOTE: We don't need a groupId specification because the group is
- org.apache.maven.plugins ...which is assumed by default.
- -->
- <artifactId>maven-assembly-plugin</artifactId>
- <version>
- <configuration>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- </configuration>
- [...]
- </project>
然後在命令列上輸入:
mvn assembly:assembly
你會在${project}/target 資料夾下發現新生成的 {artifactId}-jar-with-dependencies.jar 這個檔案
在上面的這個 命令執行的過程中,maven會將jar包所依賴的包匯出,並且解壓(unpackage),一併放在
這個{artifactId}-jar-with-dependencies.jar 包中,這樣對於程式的部署人員來說很方便,哪怕你的專案依賴了再多的第三方包,在部署的時候都會合併到一個assembly中。
但是問題又來了,在部署的過程中我們往往還是希望,將各個第三方包單獨部署,比如ibatis歸ibatis包,spring包歸spring包,這樣以後單獨為某個第三方包升級也比較方便。
其實也有解決辦法:
之前使用
[xhtml] view plaincopyprint?- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
這個jar-with-dependencies是assembly預先寫好的一個,組裝描述引用(assembly descriptor)我們來看一下這個定義這個組裝描述(assemly descriptor)的xml檔案
[xhtml] view plaincopyprint?- <assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
- <id>jar-with-dependencies</id>
- <formats>
- <format>jar</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <unpack>true</unpack>
- <scope>runtime</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>${project.build.outputDirectory}</directory>
- </fileSet>
- </fileSets>
- </assembly>
其實只要將上面這個xml檔案中的
[xhtml] view plaincopyprint?- <dependencySet>
- <unpack>true</unpack>
- <scope>runtime</scope>
- </dependencySet>
改成:
[xhtml] view plaincopyprint?- <dependencySet>
- <unpack>false</unpack>
- <scope>runtime</scope>
- </dependencySet>
在 main/assembly 下建立 src.xml檔案,將剛才修改過的內用寫入檔案中,內容為:
[xhtml] view plaincopyprint?- <assembly
- xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
- <id>jar-with-dependencies</id>
- <formats>
- <format>jar</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <unpack>false</unpack>
- <scope>runtime</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>${project.build.outputDirectory}</directory>
- </fileSet>
- </fileSets>
- </assembly>
將之前pom.xml 中的plugin改成如下:
[xhtml] view plaincopyprint?- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <descriptors>
- <descriptor>src/main/assembly/src.xml</descriptor>
- </descriptors>
- </configuration>
- </plugin>
再執行
mvn assembly:assembly
這樣在target資料夾中就會看見新創建出來的{artifactId}-jar-with-dependencies.jar 這個jar包
裡面會將專案所依賴的所有第三方包全部打包在裡面,如下圖:
轉載自:http://blog.csdn.net/mozhenghua/article/details/5671133