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。
-
项目瘦身,提升部署效率,也是一项必须要会的技能。