我們先明確下Packaging的含義(部分內(nèi)容轉(zhuǎn)載自:Maven實(shí)戰(zhàn)(九)——打包的技巧)
任何一個(gè)Maven項(xiàng)目都需要定義POM元素packaging(如果不寫則默認(rèn)值為jar)。顧名思義,該元素決定了項(xiàng)目的打包方式勉吻。實(shí)際的情形中坚芜,如果你不聲明該元素屉佳,Maven會(huì)幫你生成一個(gè)JAR包谷朝;如果你定義該元素的值為war,那你會(huì)得到一個(gè)WAR包武花;如果定義其值為POM(比如是一個(gè)父模塊)圆凰,那什么包都不會(huì)生成。
下面我們來(lái)看看maven自帶的幾種打包工具:
maven-jar-plugin
(我們可以通過(guò)mvn help:describe
命令來(lái)查看插件体箕、命令等操作的詳細(xì)說(shuō)明专钉,比如我們?cè)诿钚袌?zhí)行mvn help:describe -Dplugin=org.apache.maven.plugins:maven-jar-plugin
,便可以看到maven-jar-plugin插件的詳細(xì)介紹)
jar項(xiàng)目默認(rèn)的打包工具,默認(rèn)情況下只會(huì)將項(xiàng)目源碼編譯生成的class文件和資源文件打包進(jìn)來(lái)累铅,不會(huì)打包進(jìn)項(xiàng)目依賴的jar包跃须。
maven-war-plugin
war項(xiàng)目默認(rèn)的打包工具,默認(rèn)情況下會(huì)打包項(xiàng)目編譯生成的.class文件娃兽、資源文件以及項(xiàng)目依賴的所有jar包菇民。
maven-assembly-plugin
需要在pom文件的plugin元素中引入才可以使用,功能非常強(qiáng)大投储,是maven中針對(duì)打包任務(wù)而提供的標(biāo)準(zhǔn)插件第练。它是Maven最強(qiáng)大的打包插件,它支持各種打包文件格式玛荞,包括zip娇掏、tar.gz、tar.bz2等等勋眯,通過(guò)一個(gè)打包描述文件設(shè)置(src/main/assembly.xml)婴梧,它能夠幫助用戶選擇具體打包哪些資源文件集合、依賴客蹋、模塊志秃,甚至本地倉(cāng)庫(kù)文件,每個(gè)項(xiàng)的具體打包路徑用戶也能自由控制嚼酝。
maven-shade-plugin
需要在pom文件的plugin元素中引入才可以使用,它可以讓用戶配置Main-Class的值竟坛,然后在打包的時(shí)候?qū)⒅堤钊?META-INF/MANIFEST.MF文件闽巩。關(guān)于項(xiàng)目的依賴,它很聰明地將依賴的JAR文件全部解壓后担汤,再將得到的.class文件連同當(dāng)前項(xiàng)目的.class文件一起合并到最終的CLI包(可以直接運(yùn)行的jar包)中涎跨,這樣,在執(zhí)行CLI JAR文件的時(shí)候崭歧,所有需要的類就都在Classpath中了隅很。
如何選用這幾個(gè)插件
- 如果在開(kāi)發(fā)一個(gè)庫(kù),直接使用默認(rèn)的maven-jar-plugin插件即可率碾;
- 如果是開(kāi)發(fā)一個(gè)應(yīng)用程序叔营,可以考慮使用maven-shade-plugin進(jìn)行打包生成über jar(über jar是將應(yīng)用程序打包到單獨(dú)的jar包中屋彪,該jar包包含了應(yīng)用程序依賴的所有庫(kù)和二進(jìn)制包)
- 如果打包生成了über jar都不能滿足你的需求的話,那么推薦使用maven-assembly-plugin插件來(lái)自定義打包內(nèi)容绒尊。
我們?cè)賮?lái)看看SpringBoot的spring-boot-maven-plugin插件的打包功能
spring-boot-maven-plugin
spring-boot-maven-plugin插件在Maven中提供了對(duì)Spring Boot的支持畜挥,可以幫助我們打包出可執(zhí)行的jar包或者war包。其實(shí)spring-boot-maven-plugin所做的工作是在默認(rèn)的maven-jar-plugin插件打包結(jié)束后婴谱,將項(xiàng)目依賴的jar包中的.class文件重新進(jìn)行打包蟹但。
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ helloworld ---
[INFO] Building jar: /Users/gaozengrong/IdeaProjects/helloworld/target/helloworld-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) @ helloworld ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.357 s
[INFO] Finished at: 2017-03-19T17:51:33+08:00
[INFO] Final Memory: 33M/289M
[INFO] ------------------------------------------------------------------------
可以看出,在調(diào)用maven-jar-plugin的goal:jar任務(wù)打包之后谭羔,又調(diào)用了spring-boot-maven-plugin的goal:repackage任務(wù)华糖,這樣會(huì)產(chǎn)生兩個(gè)jar包。在helloworld這個(gè)工程里分別對(duì)應(yīng)helloworld-1.0-SNAPSHOT.jar.original
(maven-jar-plugin打包生成的jar包)瘟裸,helloworld-1.0-SNAPSHOT.jar
(spring-boot-maven-plugin重新打包生成的可執(zhí)行jar包)客叉。