maven的5種打包方式小結(jié)
一 問(wèn)題闡述
1.1 概述
在講打包方式之前,首先來(lái)說(shuō)最近踩到的坑,在idea新建的maven項(xiàng)目,在pom文件中會(huì)自動(dòng)生成一段插件的管理器:

2.我使用maven打包插件maven-assembly-plugin,將其配置添加到<plugManagement><plugs>.. ..</plugs></plugManagement>中間。

3.執(zhí)行maven 打包后:報(bào)沒(méi)有主清單,如下圖所示:

將網(wǎng)上查找了個(gè)遍,痛苦到懷疑人生,也沒(méi)有發(fā)現(xiàn)什么端倪,感覺(jué)配置的很正確,并且在eclipse中都在項(xiàng)目中用過(guò)。
1.2 原因
先來(lái)了解一下pluginManagement:
pluginManagement是表示插件聲明,即你在項(xiàng)目中的pluginManagement下聲明了插件,Maven不會(huì)加載該插件,pluginManagement聲明可以被繼承。
pluginManagement一般是用來(lái)在父POM中定義,提供給子POM使用,子POM也可以覆蓋這個(gè)定義,而且你在父POM中定義了版本之后,子模塊中直接應(yīng)用groupId和artifactId,而不用指定版本,同時(shí)也方便統(tǒng)一管理;而在父POM中的pluginManagement并不會(huì)介入到Maven的生命周期。
plugins就是直接引入一個(gè)plugin,而且可以綁定到Maven相關(guān)的生命周期上。
pluginManagement主要是為了統(tǒng)一管理插件,確保所有子POM使用的插件版本保持一致,類(lèi)似dependencies和dependencyManagement。
總結(jié)一句話(huà):pluginManagement標(biāo)簽中聲名的plug插件不參與maven的生命周期,不會(huì)被加載,但可以通過(guò)子類(lèi)繼承后,子類(lèi)應(yīng)用來(lái)使用。
這就是為何在plugManagemnet中配置maven-assembly-plugin插件后不起作用,找不到主類(lèi)的原因。
http://www.fzitv.net/program/322128g7x.htm
1.3 解決辦法
1.將plugManagement標(biāo)簽里內(nèi)容清空,自定義的的打包插件配置在</plugmanagement>標(biāo)簽之外。

2.重新打包,執(zhí)行jar包

執(zhí)行成功ok!
二 Maven常用打包插件

2.1 maven-assembly-plugin插件打包
作用:將自己項(xiàng)目中的代碼和資源,還包含了所有依賴(lài)包的內(nèi)容打成一個(gè)jar包。
1.pom文件的配置:如果有plugManagemnet則在其外面添加如下代碼
<!--自定義打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>com.ljf.test.Ha</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>2.截圖如下:

2.生成jar包的結(jié)構(gòu)
打包后會(huì)在target目錄下生成一個(gè)xxx-jar-with-dependencies.jar文件,這個(gè)文件不但包含了自己項(xiàng)目中的代碼和資源,還包含了所有依賴(lài)包的內(nèi)容。所以可以直接通過(guò)java -jar來(lái)運(yùn)行。

2.2 maven-shade-plugin插件打包
作用:和maven-assembly-plugin插件的作用一樣,將自己項(xiàng)目的代碼資源以及依賴(lài)第三方的資源一起打成一個(gè)jar包,不過(guò)如果項(xiàng)目中用到spring Framework,用maven-assembly-plugin這種方式打出來(lái)的包運(yùn)行時(shí)會(huì)出錯(cuò),使用maven-shade-plugin插件可以處理這個(gè)問(wèn)題
1.pom文件的配置:如果有plugManagemnet則在標(biāo)簽外,添加如下代碼
<!--自定義打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.ljf.test.Ha</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>2..執(zhí)行jar包后的結(jié)構(gòu)

3.執(zhí)行打包后在target目錄下會(huì)生成兩個(gè)jar包,注意不是original-xxx.jar文件,而是另外一個(gè)。和maven-assembly-plugin一樣,生成的jar文件包含了所有依賴(lài),所以可以直接運(yùn)行。
2.3 maven-jar-plugin和maven-dependency-plugin插件打包
作用:將執(zhí)行jar包和依賴(lài)包分開(kāi)(依賴(lài)包放在lib目錄下),且位于同一級(jí)目錄
2.3.1 插件功能介紹
1.maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內(nèi)容,<mainClass>com.xxg.Main</mainClass>指定MANIFEST.MF中的Main-Class,<addClasspath>true</addClasspath>會(huì)在MANIFEST.MF加上Class-Path項(xiàng)并配置依賴(lài)包,<classpathPrefix>lib/</classpathPrefix>指定依賴(lài)包所在目錄。
2.maven-dependency-plugin插件:maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內(nèi)容,只是生成MANIFEST.MF文件還不夠,maven-dependency-plugin插件用于將依賴(lài)包拷貝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目錄下。
2.3.2 pom文件的配置
1.pom文件的配置:如果有plugManagemnet標(biāo)簽,則在標(biāo)簽后面添加如下代碼
<!--自定義打包方式-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.ljf.test.Ha</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>注意:${project.build.directory}/lib 這個(gè)配置不需要修改,拿來(lái)即用。這個(gè)地方是配置依賴(lài)包存儲(chǔ)的位置。“${project.build.directory}“ maven內(nèi)置的設(shè)置無(wú)需理會(huì)。
2.執(zhí)行jar包后的結(jié)構(gòu):執(zhí)行jar包后會(huì)在target目錄下生成jar包,并將依賴(lài)包拷貝到target/lib目錄下

3. 指定了Main-Class,有了依賴(lài)包,那么就可以直接通過(guò)java -jar xxx.jar運(yùn)行jar包。
2.4 appassembler-maven-plugin插件打包
作用: 利用Maven的appassembler-maven-plugin插件,就可以實(shí)現(xiàn)自動(dòng)打包成可運(yùn)行的腳本,還可以跨平臺(tái)。(Windows/linux)
1.pom文件的配置
<plugins>
<!-- 支持java1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- -使用UTF-8編碼處理資源文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
<configuration>
<repositoryLayout>flat</repositoryLayout>
<configurationDirectory>conf</configurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<assembleDirectory>${project.build.directory}/${projectname}</assembleDirectory>
<extraJvmArguments>-Xms256m -Xmx1024m -Xss1024k -XX:PermSize=128M
-XX:MaxNewSize=256m -XX:MaxPermSize=128m</extraJvmArguments>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<repositoryName>lib</repositoryName>
<programs>
<program>
<mainClass>${mainfunction}</mainClass>
<name>startup</name>
</program>
</programs>
</configuration>
</plugin>
</plugins>2.執(zhí)行mave package操作

3. 查看打包結(jié)果:

4.進(jìn)入bin目錄下

5.Windows 下執(zhí)行startup.bat,linux下執(zhí)行startup.sh,如下圖:

6.執(zhí)行腳本時(shí)候 后面可以添加參數(shù)。

2.5 Springboot+Maven:spring-boot-maven-plugin
針對(duì)springboot和maven集成的項(xiàng)目,打成jar包,則需要使用springboot和maven集成好的打包插件:spring-boot-maven-plugin,例如特別是含有@SpringBootApplication注解的入口啟動(dòng)程序。截圖如下:

2.pom文件的配置
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.5.RELEASE</version>
<configuration>
<mainClass>com.springboot.data.es.App</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>3.截圖

4.使用maven打成jar包:mvn clean package

5.打成jar包的結(jié)構(gòu),如下

6.執(zhí)行jar包:


參考網(wǎng)址: http://www.fzitv.net/article/197968.htm
2.6 總結(jié)
不管通過(guò)何種方式打成jar包執(zhí)行,要想jar包能直接通過(guò)java -jar xxx.jar運(yùn)行,需要滿(mǎn)足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,這樣才能確定程序的入口在哪里;
2、要能加載到依賴(lài)包。
到此這篇關(guān)于maven的5種打包方式小結(jié)的文章就介紹到這了,更多相關(guān)maven 打包 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序 springboot后臺(tái)如何獲取用戶(hù)的openid
這篇文章主要介紹了微信小程序 springboot后臺(tái)如何獲取用戶(hù)的openid,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Spring Boot 中的默認(rèn)異常處理機(jī)制解析(如 /error 接口)
SpringBoot通過(guò)/error接口默認(rèn)處理異常,使用BasicErrorController返回結(jié)構(gòu)化JSON或HTML錯(cuò)誤頁(yè)面,支持自定義ErrorAttributes、ControllerAdvice及錯(cuò)誤模板,配置項(xiàng)可調(diào)整錯(cuò)誤路徑和格式,本文給大家介紹Spring Boot 中的默認(rèn)異常處理機(jī)制解析,感興趣的朋友一起看看吧2025-07-07
Maven Plugins報(bào)錯(cuò)的正確解決方案
文章介紹了如何解決Maven插件報(bào)錯(cuò)的問(wèn)題,建議在本地Maven倉(cāng)庫(kù)目錄中刪除報(bào)錯(cuò)的插件文件,然后在IDEA中刷新Maven以重新加載,同時(shí),作者還提到了一個(gè)無(wú)效的方法,即通過(guò)修改Maven的setting.xml文件添加鏡像源2026-03-03
spring集成mybatis實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離
本文通過(guò)實(shí)例代碼給大家介紹了spring集成mybatis實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離,需要的朋友可以參考下2017-08-08
SpringBoot中Filter?bean如何添加到Servlet容器
這篇文章主要介紹了SpringBoot中Filter bean是怎么被添加到Servlet容器中的,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Java中object類(lèi)常用方法及應(yīng)用場(chǎng)景詳解
這篇文章主要介紹了Java中object類(lèi)常用方法及應(yīng)用場(chǎng)景的相關(guān)資料,正確重寫(xiě)這些方法是面向?qū)ο笤O(shè)計(jì)的基本要求,有助于避免踩坑并提高代碼質(zhì)量,需要的朋友可以參考下2025-04-04
MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤(pán)
這篇文章主要介紹了MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤(pán),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

