Maven plugins 总览

1. maven-jar-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<!-- 是否创建类路径清单条目。默认值为 false -->
<addClasspath>true</addClasspath>
<!-- 文本将作为您所有“类路径” 条目的前缀。默认值为“” -->
<classpathPrefix>my-lib/</classpathPrefix>
<!-- 在 Main-Class 的清单项 -->
<mainClass>com.demo.Hellow</mainClass>
</manifest>
</archive>
<includes>
<!-- 只打包指定目录的文件 -->
<include>io/geekidea/springboot/**</include>
</includes>
</configuration>
</plugin>

2. maven-dependency-plugin

将所有依赖包全部打到指定目录,结果为一个个的小包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<!-- 自定义命名 -->
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}是maven变量,内置的,表示target目录,如果不写,将在根目录下创建/lib -->
<outputDirectory>${project.build.directory}/my-lib</outputDirectory>
<!-- excludeTransitive:是否不包含间接依赖包,比如项目依赖A,A又依赖B,是否把B打进去,默认不打(false)-->
<excludeTransitive>false</excludeTransitive>
<!-- 复制的jar文件是否去掉版本信息 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>

3. maven-shade-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<!-- 自定义命名 -->
<id>shade-flink</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- 将依赖的类重命名 -->
<relocations>
<relocation>
<pattern>org.apache.flume</pattern>
<shadedPattern>com.shaded.org.apache.flume</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.commons</pattern>
<shadedPattern>com.shaded.org.apache.commons</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<includes>
<include>*:*</include>
</includes>
<excludes>
<exclude>org.apache.flink:*</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

4. maven-assembly-plugin

assembly 配置分为两部分,一部分是 assembly 的配置文件,一部分是在 pom.xml 中的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<!-- assembly.xml -->
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
http://maven.apache.org/ASSEMBLY/2.0.0 ">

<!--唯一ID-->
<id>assembly_test</id>

<!--打包格式,允许同时有多个-->
<formats>
<format>tar.gz</format>
<format>dir</format>
<format>zip</format>
</formats>

<!--依赖jar包以及项目打包文件存储文件-->
<dependencySets>
<dependencySet>
<!--存储在 projectName-assembly-version/lib 下-->
<outputDirectory>lib</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
<scope>runtime</scope>
<excludes>
<exclude>log4j:log4j</exclude>
<exclude>org.slf4j:slf4j-log4j12</exclude>
</excludes>
</dependencySet>
</dependencySets>

<fileSets>
<fileSet>
<!--目录路径,如果不在这里指定,而在 include 中指定,那么其文件夹的也会被带进去-->
<directory>src/main/bin/</directory>
<includes>
<!--要哪些文件-->
<include>*.*</include>
</includes>
<excludes>
<!--不要哪些文件-->
<exclude>*.no_need</exclude>
</excludes>
<!--文件的权限-->
<fileMode>0755</fileMode>
<!--输出目录,存储在 projectName-assembly-version/bin 下-->
<outputDirectory>bin</outputDirectory>
<directoryMode>0755</directoryMode>
</fileSet>
</fileSets>

<files>
<!--针对单个文件-->
<file>
<!--源文件地址,相对于项目地址-->
<source>pom.xml</source>
<!--输出目录为projectName-assembly-version/-->
<outputDirectory>.</outputDirectory>
<!--文件的权限-->
<fileMode>0755</fileMode>
<!--重命名为-->
<destName>pom.xml</destName>
</file>
</files>

</assembly>

<!-- pom.xml, 假设上述 assembly 配置文件在 src/main/assembly/assembly.xml -->
<plugins>
<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<finalName>${project.name}</finalName>
<!-- 配置执行器 -->
<executions>
<execution>
<id>assembly_test</id>
<!-- 绑定到 package 生命周期阶段上 -->
<phase>package</phase>
<goals>
<!-- 只运行一次 -->
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<!--配置描述文件路径 -->
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>

打包成一个 jar, 使用命令 mvn clean package

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>x.x.x.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>clean</phase>
</execution>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

5. git-commit-id-plugin

将打包时的 git 信息生成文件在包中,官方文档地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>4.0.0</version>
<executions>
<execution>
<id>get-the-git-infos</id>
<goals>
<goal>revision</goal>
</goals>
<!-- 默认 initialize 阶段执行 -->
<phase>initialize</phase>
</execution>
<execution>
<id>validate-the-git-infos</id>
<goals>
<goal>validateRevision</goal>
</goals>
<!-- 默认是打包阶段执行 -->
<phase>package</phase>
</execution>
</executions>
<configuration>
<!-- 默认 false,构建时打印信息 -->
<verbose>false</verbose>
<!-- 默认 false,即不会生成 git.properties 文件 -->
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<!-- 默认是 false,不会将 git 属性注入到所有项目中 -->
<injectAllReactorProjects>false</injectAllReactorProjects>
<!-- 默认 false,它将执行 git fetch 操作,否则仅获取本地状态 -->
<offline>false</offline>
</configuration>
</plugin>

其他可选 <configuration>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<!-- .git 本地文件记录,默认是 ${project.basedir}/.git -->
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
<!-- 属性前缀,默认是 git, 可以理解为 namespace -->
<prefix>git</prefix>
<!-- 默认的日期格式,可选 git.commit.time 或 git.build.time 等 -->
<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
<!--
时区(java.util.TimeZone.getDefault().getID()).
可以如下方式指定:
`MAVEN_OPTS=-Duser.timezone=UTC mvn clean package` 或 `mvn clean package -Duser.timezone=UTC`
-->
<dateFormatTimeZone>${user.timezone}</dateFormatTimeZone>
<!--
默认生成的文件名 ${project.build.outputDirectory}/git.properties,
可以使用相对于${project.basedir}的相对路径(e.g. target/classes/git.properties),
或者全路径(e.g. ${project.build.outputDirectory}/git.properties)
-->
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
<!--
文件格式,默认 properties,
可以使用 json 当设置为 json 时,需要设置
`<commitIdGenerationMode>full</commitIdGenerationMode>`
-->
<format>properties</format>
<!-- 默认 true,如果打包是 pom,则运行该插件 -->
<skipPoms>true</skipPoms>
<!-- 默认 false,即没有找到 .git 目录时,插件将跳过执行 -->
<failOnNoGitDirectory>true</failOnNoGitDirectory>
<!-- 默认 true,如果插件无法获取足够的数据来完成,跳过执行该插件 -->
<failOnUnableToExtractRepoInfo>true</failOnUnableToExtractRepoInfo>
<!-- 默认 false, 插件执行将不会跳过 -->
<skip>false</skip>
<!-- 默认 false,否则只在一个模块中运行一次 -->
<runOnlyOnce>false</runOnlyOnce>
<!-- 排除属性 -->
<excludeProperties>
<excludeProperty>git.user.*</excludeProperty>
</excludeProperties>
<!-- 只包含某类属性,和 excludeProperties 相对 -->
<includeOnlyProperties>
<includeOnlyProperty>^git.commit.id.full$</includeOnlyProperty>
</includeOnlyProperties>
<!--
属性替换,匹配到规则的属性值在某个阶段替换为另外的属性值
-->
<replacementProperties>
<replacementProperty>
<property>git.branch</property>
<propertyOutputSuffix>something</propertyOutputSuffix>
<token>^([^\/]*)\/([^\/]*)$</token>
<value>$1-$2</value>
<regex>true</regex>
<forceValueEvaluation>false</forceValueEvaluation>
<transformationRules>
<transformationRule>
<apply>BEFORE</apply>
<action>UPPER_CASE</action>
</transformationRule>
<transformationRule>
<apply>AFTER</apply>
<action>LOWER_CASE</action>
</transformationRule>
</transformationRules>
</replacementProperty>
</replacementProperties>
<!--
默认 false,此插件附带自定义的 jgit 实现,用于获取所有相关信息,
也可以使用以下命令开启 -Dmaven.gitcommitid.nativegit=true
-->
<useNativeGit>false</useNativeGit>
<!-- 超时时间,默认 30000 毫秒-->
<nativeGitTimeoutInMs>30000</nativeGitTimeoutInMs>
<!--
默认 7,配置缩写 git 提交 id 的长度 (git.commit.id.abbrev) 到长度至少为 N,
最大值为 40,因为最大 SHA-1 长度
-->
<abbrevLength>7</abbrevLength>
<!-- git.commit.id 类型,默认为 "flat",可选 "full" -->
<commitIdGenerationMode>flat</commitIdGenerationMode>
<!--
可以用作非常强大的版本控制助手, 可以参考https://git-scm.com/docs/git-describe
-->
<gitDescribe>
<!-- 默认 false,为 true 时跳过如下配置 -->
<skip>false</skip>
<!-- 默认 true,当提交附近找不到标记时,会使用提交的id -->
<always>true</always>
<!-- 在描述输出中,哈希的对象 id 总是缩写为 N个字母,默认为 7 -->
<abbrev>7</abbrev>
<!-- 在处于未提交的存储库上运行时,将输出将包含一个附加后缀 -->
<dirty>-dirty</dirty>
<!-- 默认 *,即包含所有信息,可以使用它来防止存储库私有标记泄漏 -->
<match>*</match>
<!-- 默认 false,默认情况下只查找带注释的标记 -->
<tags>false</tags>
<!-- 默认 false,只返回标记名 -->
<forceLongFormat>false</forceLongFormat>
</gitDescribe>
<!-- 附加的验证实用程序,可用于验证项目属性是否设置 -->
<validationProperties>
<validationProperty>
<!-- 用于识别验证的描述性名称,当不匹配时将显示在错误消息中 -->
<name>validating project version</name>
<value>${project.version}</value>
<!-- 期望值 -->
<shouldMatchTo><![CDATA[^.*(?<!-SNAPSHOT)$]]></shouldMatchTo>
</validationProperty>
</validationProperties>
<!-- 默认 true,如果有与预期不符,则校验失败 -->
<validationShouldFailIfNoMatch>true</validationShouldFailIfNoMatch>
<!-- 默认 HEAD,将引用最新的在存储库中的提交 -->
<evaluateOnCommit>HEAD</evaluateOnCommit>
<!-- 默认 true,为 true 时,此插件将尝试使用生成环境中的分支名称 -->
<useBranchNameFromBuildEnvironment>true</useBranchNameFromBuildEnvironment>
<!--
默认 true,此插件将尝试将生成的属性公开到 System.getProperties() ,
通过命令行提供的参数,如 "-Dgit.commit.id=值" 仍然有优先权
-->
<injectIntoSysProperties>true</injectIntoSysProperties>