1. spring-boot-maven-plugin插件(在springboot項目中使用)
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>spring-boot</classifier><mainClass>com.xy.Application</mainClass></configuration></execution></executions>
</plugin>
2.?shade插件(推薦)
執行mvn package后,會在target文件夾下生成兩個jar包,一個是不帶依賴的jar包,一個是后綴有-shaded帶有依賴的jar包。?
<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.my.jvm.AssemblyTest</mainClass></transformer></transformers></configuration></execution></executions></plugin>
3.?assembly插件(spring項目可能會報錯)
執行mvn package后,會在target文件夾下生成兩個jar包,一個是不帶依賴的jar包,一個是后綴有-dependencies帶有依賴的jar包。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.my.jvm.AssemblyTest</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration>
</plugin>
4.?maven-jar-plugin插件
最終打出來的jar包,沒有其他依賴包,第三方依賴包集中放在 lib文件夾下。
addClasspath:是否在manifest文件中添加classpath。默認為false。如果為true,則會在manifest文件中添加classpath,這樣在啟動的時候就不用再手動指定classpath了。
<plugin><artifactId>maven-jar-plugin</artifactId><executions><execution><id>make-a-jar</id><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions><configuration><archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.my.jvm.AssemblyTest</mainClass> </manifest> </archive><excludes><exclude>*.properties</exclude><exclude>*.txt</exclude></excludes></configuration></plugin>
5. maven-dependency-plugin插件
這個插件似乎并不能直接打成可執行jar,它的常見的作用是把依賴集中起來放在lib文件夾下,經常配合maven-jar-plugin或者spring-boot-maven-plugin使用。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>prepare-package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/libs</outputDirectory></configuration></execution></executions>
</plugin>
6. 手動修改打包配置(不推薦)
/META-INF/ MANIFEST.MF
普通的jar包:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Administrator
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_171
要變成可執行jar包,需要指定main
Main-Class:com.my.jvm.AssemblyTest
如果jar包有依賴其他第三方jar,還要指定Class-Path
Class-Path:lib/log4j-1.2.17.jar lib/slf4j-log4j12-1.7.21.jar lib/slf4
?7.項目瘦身方式
把固定的不會經常變的第三方jar提前放在服務器上,每次只要更新自己的業務代碼jar包即可
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><!--layout 屬性用來指定打成 jar 還是war 文件,可用的值包括:ZIP 、JAR 、WAR、 NONE 。默認JAR--><layout>ZIP</layout><!--這里是填寫需要包含進去的jar,必須項目中的某些模塊,會經常變動,那么就應該將其坐標寫進來如果沒有則nothing ,表示不打包依賴 --><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration></plugin><!--拷貝依賴到jar外面的lib目錄--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!--指定的依賴路徑--><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build>
執行需要通過-Dloader.path指定lib的路徑:
java -Dloader.path=./lib -jar myProj-1.0.0.jar
如果自己的項目里有自己的依賴需要,而且經常會更新,那就不能放在lib里了,lib里保證是放第三方jar包,不會去動版本的。
那怎么做:spring-boot-maven-plugin 里的includes加需要包即可。
<!--這里是填寫需要包含進去的jar,如果沒有則nothing --><includes><include><groupId>com.jincou</groupId><artifactId>xiaoxiao-util</artifactId></include></includes>
缺點:多人項目難管理第三方jar,如果第三方jar包有人要更新,就有可能會忘記去服務器上更新。
總結:
-
普通項目用shade、assembly都行,我喜歡用shade。
-
springboot項目用spring-boot-maven-plugin。
-
項目瘦身,提升部署效率,也是一項必須要會的技能。