maven实用技巧篇
- 多线程及跳过测试
# 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建
$ mvn -T 4 clean install
$ mvn -T 1C clean install
-DskipTests # 不执行测试用例,但编译测试用例类生成相应的 class 文件至 target/test-classes 下
-Dmaven.test.skip=true # 不执行测试用例,也不编译测试用例类
# 结合上文的`并行执行`
$ mvn -T 1C clean install -Dmaven.test.skip=true
# 通过指定之前失败的模块名,可以继续之前的编译
$ mvn -rf :moduleName clean install
maven–插件篇(assembly插件)
maven-assembly-plugin
简单的说,maven-assembly-plugin 就是用来帮助打包用的,比如说打出一个什么类型的包,包里包括哪些内容等等。
- 在父项目的pom中引入该插件
<properties>
<maven.assembly.plugin.version>2.3</maven.assembly.plugin.version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${maven.assembly.plugin.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
- 然后在负责打包分发的 distribution模块中的pom文件中重新引入该插件,如下所示:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution> <!-- 配置执行器 -->
<id>assemble</id>
<phase>package</phase> <!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>single</goal> <!-- 只运行一次 -->
</goals>
<configuration>
<finalName>flowmgr-${project.version}</finalName>
<!--主类入口等-->
<descriptors>
<descriptor>src/assembly/bin-common.xml</descriptor> <!--配置描述文件路径-->
</descriptors>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
其中主要涉及两个参数的定义,分别为:goal与descriptors
- goal的参数single说明该模块仅运行一次,可执行以下命令完成打包等操作。
1. mvn assembly:single
&
2. mvn clean package #需要绑定到package的生命周期上
- descriptors指的是打包执行器。此处仅以自定义执行器说明。
一般来说,内置的assembly descriptor满足不了多样性需求,这个时候就需要写自己的assembly descriptor的实现了。使用 descriptors,指定打包文件 src/assembly/bin-common.xml,即在配置文件内指定打包操作要使用这个自定义assembly descriptor(自定义的xml中配置),需要如下配置,即要引入描述文件:
<configuration>
<finalName>flowmgr-${project.version}</finalName>
<!--主类入口等-->
<descriptors>
<descriptor>src/assembly/bin-common.xml</descriptor><!--配置描述文件路径-->
</descriptors>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
descriptor实例:
<?xml version='1.0' encoding='UTF-8'?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>demo</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}/classes</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
这个定义很简单:
- id
<id>distribution</id>
。id 标识符,添加到生成文件名称的后缀符。如果指定 id 的话,目标文件则是${artifactId}-${id}.tar.gz
- format:指定打包类型;maven-assembly-plugin 支持的打包格式有zip、tar、tar.gz (or tgz)、tar.bz2 (or tbz2)、jar、dir、war,可以同时指定多个打包格式
- includeBaseDirectory:指定是否包含打包层目录(比如finalName是output,当值为true,所有文件被放在output目录下,否则直接放在包的根目录下);
- fileSets:指定要包含的文件集,可以定义多个fileSet;
- directory:指定要包含的目录;
- outputDirectory:指定当前要包含的目录的目的地。
回到pom的配置中,自定义的configuration配置后,将会生成一个demo-demo.jar 文件在目录 output 下,其中前一个demo来自finalName,后一个demo来自assembly descriptor中的id,其中的内容和默认的打包出来的jar类似。
如果只想有finalName,则增加配置:
<appendAssemblyId>false</appendAssemblyId>
对于描述文件的元素,即assembly.xml中的配置节点的详细配置,在此稍作总结,见下。
- dependencySets
用来定制工程依赖 jar 包的打包方式,核心元素如下表所示。
元素 | 类型 | 作用 |
---|---|---|
outputDirectory | String | 指定包依赖目录,该目录是相对于根目录 |
includes | List | 包含依赖 |
excludes | List | 排除依赖 |
实例:
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<excludes>
<exclude>${project.groupId}:${project.artifactId}</exclude>
</excludes>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<includes>
<include>${project.groupId}:${project.artifactId}</include>
</includes>
</dependencySet>
</dependencySets>
versions-maven-plugin插件
整体修改项目版本的插件
首先在父项目的pom.xml文件中加入
<!-- https://mvnrepository.com/artifact/org.codehaus.mojo/versions-maven-plugin -->
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
</dependency>
然后执行
mvn versions:set -DnewVersion=x.y.z
或者
mvn clean org.codehaus.mojo:versions-maven-plugin:2.3:set -DnewVersion=x.y.z
即将版本修改为x.y.z且每个项目的pom文件进行了备份,如果新版本有误,则撤销新版本号
mvn versions:revert
当确定无误后,提交修改
mvn versions:commit
maven-enforcer-plugin插件
maven插件enforcer解决jar之间冲突和类冲突
enforce配置实例
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-dependencies</id>
<goals>
<goal>display-info</goal>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0.3,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>1.7.0</version>
</requireJavaVersion>
</rules>
<fail>true</fail>
</configuration>
</plugin>
该插件默认绑定在validate阶段,有三个目标 display-info和enforce、help
- display-info用于显示基本环境信息
- enforce用于规则检查
- help帮助信息,mvn enforcer:help -Ddetail=true -Dgoal=
该插件内置完整的规则列表:
执行命令
- enforcer:display-info enforcer:enforce
- enforcer:help -Ddetail=true -Dgoal=enforce
enforce目标
支持三个选项:
-skip - a quick way to skip checks via a profile or using -Denforcer.skip=true from
the command line.
- fail- if the goal should fail the build when a rule fails. The default is true.
If false, the errors will be logged as warnings. - failFast - if the goal should stop checking after the first failure. The default
is false.
maven-shade-plugin
用于把多个jar包,打成1个jar包
一般Java项目都会依赖其他第三方jar包,最终打包时,希望把其他jar包包含在一个jar包里。
与assembly类似,使用assembly即可。以下详解assembly。
maven-install-plugin
http://rogerming.iteye.com/blog/1980992
https://www.baeldung.com/install-local-jar-with-maven/
参考:
- 本文参考博文Maven 高级玩法