maven的5種打包方式小結
一 問題闡述
1.1 概述
在講打包方式之前,首先來說最近踩到的坑,在idea新建的maven項目,在pom文件中會自動生成一段插件的管理器:
2.我使用maven打包插件maven-assembly-plugin,將其配置添加到<plugManagement><plugs>.. ..</plugs></plugManagement>中間。
3.執(zhí)行maven 打包后:報沒有主清單,如下圖所示:
將網上查找了個遍,痛苦到懷疑人生,也沒有發(fā)現什么端倪,感覺配置的很正確,并且在eclipse中都在項目中用過。
1.2 原因
先來了解一下pluginManagement:
pluginManagement是表示插件聲明,即你在項目中的pluginManagement下聲明了插件,Maven不會加載該插件,pluginManagement聲明可以被繼承。
pluginManagement一般是用來在父POM中定義,提供給子POM使用,子POM也可以覆蓋這個定義,而且你在父POM中定義了版本之后,子模塊中直接應用groupId和artifactId,而不用指定版本,同時也方便統(tǒng)一管理;而在父POM中的pluginManagement并不會介入到Maven的生命周期。
plugins就是直接引入一個plugin,而且可以綁定到Maven相關的生命周期上。
pluginManagement主要是為了統(tǒng)一管理插件,確保所有子POM使用的插件版本保持一致,類似dependencies和dependencyManagement。
總結一句話:pluginManagement標簽中聲名的plug插件不參與maven的生命周期,不會被加載,但可以通過子類繼承后,子類應用來使用。
這就是為何在plugManagemnet中配置maven-assembly-plugin插件后不起作用,找不到主類的原因。
http://www.dbjr.com.cn/program/322128g7x.htm
1.3 解決辦法
1.將plugManagement標簽里內容清空,自定義的的打包插件配置在</plugmanagement>標簽之外。
2.重新打包,執(zhí)行jar包
執(zhí)行成功ok!
二 Maven常用打包插件
2.1 maven-assembly-plugin插件打包
作用:將自己項目中的代碼和資源,還包含了所有依賴包的內容打成一個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包的結構
打包后會在target目錄下生成一個xxx-jar-with-dependencies.jar文件,這個文件不但包含了自己項目中的代碼和資源,還包含了所有依賴包的內容。所以可以直接通過java -jar來運行。
2.2 maven-shade-plugin插件打包
作用:和maven-assembly-plugin插件的作用一樣,將自己項目的代碼資源以及依賴第三方的資源一起打成一個jar包,不過如果項目中用到spring Framework,用maven-assembly-plugin這種方式打出來的包運行時會出錯,使用maven-shade-plugin插件可以處理這個問題
1.pom文件的配置:如果有plugManagemnet則在標簽外,添加如下代碼
<!--自定義打包方式--> <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包后的結構
3.執(zhí)行打包后在target目錄下會生成兩個jar包,注意不是original-xxx.jar文件,而是另外一個。和maven-assembly-plugin一樣,生成的jar文件包含了所有依賴,所以可以直接運行。
2.3 maven-jar-plugin和maven-dependency-plugin插件打包
作用:將執(zhí)行jar包和依賴包分開(依賴包放在lib目錄下),且位于同一級目錄
2.3.1 插件功能介紹
1.maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內容,<mainClass>com.xxg.Main</mainClass>指定MANIFEST.MF中的Main-Class,<addClasspath>true</addClasspath>會在MANIFEST.MF加上Class-Path項并配置依賴包,<classpathPrefix>lib/</classpathPrefix>指定依賴包所在目錄。
2.maven-dependency-plugin插件:maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分內容,只是生成MANIFEST.MF文件還不夠,maven-dependency-plugin插件用于將依賴包拷貝到<outputDirectory>${project.build.directory}/lib</outputDirectory>指定的位置,即lib目錄下。
2.3.2 pom文件的配置
1.pom文件的配置:如果有plugManagemnet標簽,則在標簽后面添加如下代碼
<!--自定義打包方式--> <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 這個配置不需要修改,拿來即用。這個地方是配置依賴包存儲的位置。“${project.build.directory}“ maven內置的設置無需理會。
2.執(zhí)行jar包后的結構:執(zhí)行jar包后會在target目錄下生成jar包,并將依賴包拷貝到target/lib目錄下
3. 指定了Main-Class,有了依賴包,那么就可以直接通過java -jar xxx.jar運行jar包。
2.4 appassembler-maven-plugin插件打包
作用: 利用Maven的appassembler-maven-plugin插件,就可以實現自動打包成可運行的腳本,還可以跨平臺。(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. 查看打包結果:
4.進入bin目錄下
5.Windows 下執(zhí)行startup.bat,linux下執(zhí)行startup.sh,如下圖:
6.執(zhí)行腳本時候 后面可以添加參數。
2.5 Springboot+Maven:spring-boot-maven-plugin
針對springboot和maven集成的項目,打成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包的結構,如下
6.執(zhí)行jar包:
參考網址: http://www.dbjr.com.cn/article/197968.htm
2.6 總結
不管通過何種方式打成jar包執(zhí)行,要想jar包能直接通過java -jar xxx.jar運行,需要滿足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,這樣才能確定程序的入口在哪里;
2、要能加載到依賴包。
到此這篇關于maven的5種打包方式小結的文章就介紹到這了,更多相關maven 打包 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot?AOP?Redis實現延時雙刪功能實戰(zhàn)
本文主要介紹了SpringBoot?AOP?Redis實現延時雙刪功能實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08Spring Boot利用Java Mail實現郵件發(fā)送
這篇文章主要為大家詳細介紹了Spring Boot利用Java Mail實現郵件發(fā)送,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02