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