1. maven-shade-plugin(常用)
可以将依赖打进jar包里面,只有一个插件目标shade:shade
,通常绑定在package
生命周期阶段。
1.1 包含或过滤jar包
<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<includes>
<include>com.alibaba:fastjson</include>
</includes>
</artifactSet>
1.2 过滤特定的资源文件
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
1.3 没用的类直接过滤掉,打最小包
<minimizeJar>true</minimizeJar>
1.4 修改包名
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>myclassname</shadedClassifierName>
1.5 构建可执行的jar包(需要指定默认main类)
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.king.MyMainClass</mainClass>
</transformer>
</transformers>
完整的插件格式如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!--<artifactSet>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<includes>
<include>com.alibaba:fastjson</include>
</includes>
</artifactSet>-->
<!--<minimizeJar>true</minimizeJar>-->
<!--<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.king.MyMainClass</mainClass>
</transformer>
</transformers>-->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>shade</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
2. maven-compiler-plugin
编译目标: compile:compile和compile:test-compile
通常简写为以下:
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
如果显示的声明如下:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
3. maven-resource-plugin(针对资源文件的配置)
将资源文件打包进jar包中。
3.1 简写配置
默认不用显示配置,就会把src/main/resources
复制到jar包中的classes
下,
把srct/test/resources
复制到jar包中的test-classes
下。
<resources>
<resource>
<directory>src/main/env</directory>
</resource>
</resources>
3.2 过滤或包含资源文件
<includes>
<include>2.text</include>
</includes>
<excludes>
<exclude>1.text</exclude>
</excludes>
3.3 自定义打包的位置
当在build设置该属性,maven-resource-plugin将不会执行默认的src/main/resources复制到jar中的classes)
<outputDirectory>${basedir}/target/classes1</outputDirectory>
3.4 过滤资源文件的属性
例如定义公共属性,可以在其他文件引入属性的值(例如password等),需指定两个事:构建配置的filters元素中的属性文件列表,以及一个标记告诉Maven资源目录需要过滤。
下面的例子:定义default.properties为过滤文件(可以理解为其他文件要经过该文档过滤下),src/main/resources中的文件可以使用default.properties定义的属性值
注意设置true和有没有没有直接关系,即使没有文件,true也是可以获取pom文件或settings.xml,profile中定义的属性。
<build>
<filters>
<filter>src/main/filters/default.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
3.5 自定义资源文件目录
我们知道上面几个例子都是插件目标resources:resources完成,当我们需要更加自由的自定义文件来源和文件来源的时候,这就要用resources:copy-resources插件目标,很明显这个插件的功能就是复制文件。
下面的例子:在generate-resources生命周期调用resources:copy-resources插件目标完成文件的复制工作
注意:resources:copy-resources并不会影响resources:resources,索引默认的资源位置也同样生成。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-file</id>
<phase>generate-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!--输出目录-->
<outputDirectory>${basedir}/target/classes1</outputDirectory>
<resources>
<resource>
<!--资源-->
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>1.text</include>
</includes>
<!-- <excludes>
<exclude>1.text</exclude>
</excludes>-->
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
上面的所有语法集合:
<build>
<!--<resources>
<resource>
<directory>src/main/env</directory>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes1</outputDirectory>-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-file</id>
<phase>generate-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!--输出目录-->
<outputDirectory>${basedir}/target/classes1</outputDirectory>
<resources>
<resource>
<!--资源-->
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>1.text</include>
</includes>
<!-- <excludes>
<exclude>1.text</exclude>
</excludes>-->
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
4. maven-jar-plugin
maven-jar-plugin通常也是不需要显示声明配置的,因为本身就默认绑定到package生命周期上的。功能是把工程打成一个可以运行的jar(注意这个插件不会把依赖打入jar包中)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<!-- 指定入口函数 -->
<mainClass>com.sf.Main</mainClass>
<!-- 是否要把第三方jar放到manifest的classpath中 注意:这个配置不是说把依赖打进配置中,只是说把这个工程需要哪些依赖说明下-->
<addClasspath>true</addClasspath>
<!-- 去该目标下去找依赖的jar包 -->
<classpathPrefix>lib</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
注意事项:
如果我们打包成功,直接运行 java -jar xxx.jar 基本会提示没有依赖包,这是因为并没有把依赖打进来,所以需要你的运行环境提供依赖包,而且依赖包要放在lib这个目录下;
这个包是怎么知道我们运行的主类呢?通过上面的配置,jar中有META-INF/MANIFEST.MF
下面是我这个工程的MANIFEST.MF文件内容
Manifest-Version: 1.0
Built-By: zhangsan
Class-Path: lib/junit-4.12.jar lib/hamcrest-core-1.3.jar lib/fastjson-1.2.58.jar
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_202
Main-Class: com.sf.Main
通过该文件,该jar可以知道去哪里找依赖jar和主类
如果你需要知道这个工程需要哪些jar包,并获取可以使用maven-dependency-plugin插件把依赖的jar包放入一个单独的目录中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
6 maven-assembly-plugin
个性化打包的maven-assembly-plugin插件,该插件只有一个目标assembly:single,默认不会执行,要自己绑定到生命周期阶段。
官方也介绍了如果想要打成jar,建议使用maven-shade-plugin。
使用这个插件你要告诉这个插件怎么执行,这个配置就是assembly的描述符,maven提供了几个assembly插件预定义的,也可以自定义,同时在配置中,我们可以一次执行多个描述符。
- 指定预定义的描述符(就是已经设置了很多参数,告诉插件什么事了)
- 指定自定义的描述符;描述符的id会作为生成包的命名的一部分。
官方预定义的描述符:
- bin: 默认将bin目录下文件打入包中
- jar-with-dependencies : 会将所有依赖都解压打包
- src:只将源码目录下的文件打包
- project:将整个project资源打包
下面是官方预定义的jar-with-dependencies描述符。
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<!-- TODO: a jarjar format would be better -->
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
自定义的描述符:distribution.xml,定义文件过滤和依赖打包
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>distribution</id>
<formats>
<format>jar</format>
</formats>
<files>
<file>
<source>src/main/env/prod.properties</source>
<outputDirectory></outputDirectory>
<filtered>true</filtered>
</file>
<file>
<source>src/main/resources/1.txt</source>
<outputDirectory></outputDirectory>
</file>
</files>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
上面用到的所有语法集合:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<!--<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>-->
<filters>
<filter>src/main/assembly/filter.properties</filter>
</filters>
<descriptors>
<descriptor>src/main/assembly/distribution.xml</descriptor>
</descriptors>
<!--打包成可执行的jar包:默认主类 (archive仅仅支持jar和war包)-->
<archive>
<manifest>
<mainClass>com.sf.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
更多参数参考地址:https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html