maven的5種打包方式小結(jié)
一 問題闡述
1.1 概述
在講打包方式之前,首先來說最近踩到的坑,在idea新建的maven項(xiàng)目,在pom文件中會自動生成一段插件的管理器:
2.我使用maven打包插件maven-assembly-plugin,將其配置添加到<plugManagement><plugs>.. ..</plugs></plugManagement>中間。
3.執(zhí)行maven 打包后:報(bào)沒有主清單,如下圖所示:
將網(wǎng)上查找了個(gè)遍,痛苦到懷疑人生,也沒有發(fā)現(xiàn)什么端倪,感覺配置的很正確,并且在eclipse中都在項(xiàng)目中用過。
1.2 原因
先來了解一下pluginManagement:
pluginManagement是表示插件聲明,即你在項(xiàng)目中的pluginManagement下聲明了插件,Maven不會加載該插件,pluginManagement聲明可以被繼承。
pluginManagement一般是用來在父POM中定義,提供給子POM使用,子POM也可以覆蓋這個(gè)定義,而且你在父POM中定義了版本之后,子模塊中直接應(yīng)用groupId和artifactId,而不用指定版本,同時(shí)也方便統(tǒng)一管理;而在父POM中的pluginManagement并不會介入到Maven的生命周期。
plugins就是直接引入一個(gè)plugin,而且可以綁定到Maven相關(guān)的生命周期上。
pluginManagement主要是為了統(tǒng)一管理插件,確保所有子POM使用的插件版本保持一致,類似dependencies和dependencyManagement。
總結(jié)一句話:pluginManagement標(biāo)簽中聲名的plug插件不參與maven的生命周期,不會被加載,但可以通過子類繼承后,子類應(yīng)用來使用。
這就是為何在plugManagemnet中配置maven-assembly-plugin插件后不起作用,找不到主類的原因。
http://www.dbjr.com.cn/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)目中的代碼和資源,還包含了所有依賴包的內(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)
打包后會在target目錄下生成一個(gè)xxx-jar-with-dependencies.jar文件,這個(gè)文件不但包含了自己項(xiàng)目中的代碼和資源,還包含了所有依賴包的內(nèi)容。所以可以直接通過java -jar來運(yùn)行。
2.2 maven-shade-plugin插件打包
作用:和maven-assembly-plugin插件的作用一樣,將自己項(xiàng)目的代碼資源以及依賴第三方的資源一起打成一個(gè)jar包,不過如果項(xiàng)目中用到spring Framework,用maven-assembly-plugin這種方式打出來的包運(yùn)行時(shí)會出錯(cuò),使用maven-shade-plugin插件可以處理這個(gè)問題
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目錄下會生成兩個(gè)jar包,注意不是original-xxx.jar文件,而是另外一個(gè)。和maven-assembly-plugin一樣,生成的jar文件包含了所有依賴,所以可以直接運(yùn)行。
2.3 maven-jar-plugin和maven-dependency-plugin插件打包
作用:將執(zhí)行jar包和依賴包分開(依賴包放在lib目錄下),且位于同一級目錄
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>會在MANIFEST.MF加上Class-Path項(xiàng)并配置依賴包,<classpathPrefix>lib/</classpathPrefix>指定依賴包所在目錄。
2.maven-dependency-plugin插件:maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內(nèi)容,只是生成MANIFEST.MF文件還不夠,maven-dependency-plugin插件用于將依賴包拷貝到<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è)配置不需要修改,拿來即用。這個(gè)地方是配置依賴包存儲的位置。“${project.build.directory}“ maven內(nèi)置的設(shè)置無需理會。
2.執(zhí)行jar包后的結(jié)構(gòu):執(zhí)行jar包后會在target目錄下生成jar包,并將依賴包拷貝到target/lib目錄下
3. 指定了Main-Class,有了依賴包,那么就可以直接通過java -jar xxx.jar運(yùn)行jar包。
2.4 appassembler-maven-plugin插件打包
作用: 利用Maven的appassembler-maven-plugin插件,就可以實(shí)現(xiàn)自動打包成可運(yùn)行的腳本,還可以跨平臺。(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
針對springboot和maven集成的項(xiàng)目,打成jar包,則需要使用springboot和maven集成好的打包插件:spring-boot-maven-plugin,例如特別是含有@SpringBootApplication注解的入口啟動程序。截圖如下:
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.dbjr.com.cn/article/197968.htm
2.6 總結(jié)
不管通過何種方式打成jar包執(zhí)行,要想jar包能直接通過java -jar xxx.jar運(yùn)行,需要滿足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,這樣才能確定程序的入口在哪里;
2、要能加載到依賴包。
到此這篇關(guān)于maven的5種打包方式小結(jié)的文章就介紹到這了,更多相關(guān)maven 打包 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security注解方式權(quán)限控制過程
這篇文章主要介紹了Spring Security注解方式權(quán)限控制過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03Spring通過<import>標(biāo)簽導(dǎo)入外部配置文件
之前文章里我們講到Spring加載Xml配置文件的細(xì)節(jié),那么加載完了我們肯定要解析這個(gè)配置文件中定義的元素。這篇我們首先來分析下Spring是如何通過標(biāo)簽導(dǎo)入外部配置文件的。2021-06-06SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn)
本文主要介紹了SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Spring Boot利用Java Mail實(shí)現(xiàn)郵件發(fā)送
這篇文章主要為大家詳細(xì)介紹了Spring Boot利用Java Mail實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02了解Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式
這篇文章主要介紹了Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式,涉及到Java內(nèi)存分配相關(guān)方面的知識,需要的朋友可以參考下2016-01-01