uRick's PKM uRick's PKM
首页
导航
  • Java
  • 数据库
书单
  • 优质好文
  • 有趣的工具
  • 分类
  • 标签
  • 归档
关于
首页
导航
  • Java
  • 数据库
书单
  • 优质好文
  • 有趣的工具
  • 分类
  • 标签
  • 归档
关于
  • IDEA实用技巧
  • Markdown 指南
  • Vnote笔记管理工具
  • Maven常用技巧
    • 1. 简介
    • 2. 安装(配置环境变量)
    • 3. pom.xml文件解析
    • 4. 奇妙的依赖
      • 4.1. 依赖的作用域
      • 4.2. 传递性依赖
      • 4.3. 排除依赖
    • 5. setting.xml配置解析
    • 6. 仓库
      • 6.1. Maven仓库的分类
      • 6.2. 远程仓库的配置
    • 7. 生命周期
    • 8. maven的聚合与继承
      • 8.1. 聚合
      • 8.2. 继承
      • 8.3. 依赖管理和插件管理
      • 8.4. 约定尤于配置
    • 9. 常用命令
    • 10. 遇到的问题
      • 10.1. maven 本地打包到私服
      • 10.2. 使用maven动态切换profile环境资源
      • 10.3. 配置Profile仓库
      • 10.4. 本地JAR打包到仓库
      • 10.5. Maven 项目每次编译默认1.5版本问题解决
    • 11. 常用插件
      • 11.1. maven-javadoc-plugin
      • 11.2. maven-source-plugin
      • 11.3. maven-assembly-plugin
    • 12. Maven版本号的约定
    • 13. 常用的maven仓库
  • Linux命令集
  • tools
uRick
2019-12-15
目录

Maven常用技巧

# 1. 简介

Maven是一款优秀强大的跨平台的构建项目工具,能够帮助我们快速完成项目构建,从清理、编译、打包、部署都可以基于插件一条龙自动完成,非常方便快捷。 本文主要收录笔者工作中遇到的问题和使用技巧。

# 2. 安装(配置环境变量)

m2_home:家目录或者maven_home
path:.%maven_home%/bin/

maven目录结构

配置详见官方文档,入门级操作,这里不在赘述。

# 3. pom.xml文件解析

如下每个项目pom组成部分都标注了注释,

  <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!--POM模型版本-->
	<modelVersion>4.0.0</modelVersion>
	<!--项目组-->
	<groupId>com.bdr.test</groupId>
	<!--项目命名-->
	<artifactId>MyTest</artifactId>
	<version>1.1.0</version>
	<name>这是一个项目名称</name>
	<!--聚合和继承定义pom,这里的打包类型需要定义为pom打包方式-->
	<packaging>pom</packaging>
	<url>http://maven.apache.org</url>
	<!--模块化定义-->
	<moudles>
		<moudle>moudle name </moudle>
		<moudle>.....</moudle>
		<moudle>......</moudle>
		<moudle></moudle>
		<moudle></moudle>
	</moudles>
	<!-- parent是继承父pom -->
	<parent>
		<groupId>org.ibase4j</groupId>
		<artifactId>iBase4J</artifactId>
		<version>1.1.0</version>
	</parent>
	<properties>
		<!-- mybatis版本号 -->
		<!-- 依赖归类 -->
		<mybatis.version>3.4.2</mybatis.version>
		<mybatis-spring.version>1.3.1</mybatis-spring.version>
		<mybatis-plus.version>2.0.7</mybatis-plus.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<!-- 依赖的作用域 -->
			<scope>test</scope>
			<!--该标签是在<dependency></dependency>​中,排除传递依赖-->
			<exclusions>
				<exclusion>
					<groupId></groupId>
					<artifactId></artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>
	<!-- 通过distributionManagement将项目打包部署到远程仓库,一搬发布部署需要进行远程仓库认证-->
	<distributionManagement>
		<!--发布版本仓库-->
		<repository>
			<id></id>
			<name></name>
			<url><url>
		</repository>
		<!--快照版本仓库-->
		<snapshotRepository>
			<id></id>
			<name></name>
			<url><url>
		</snapshotRepository>
	</distributionManagement>
	<!--配置远程仓库信息-->
	<repositories>
		<repository>
			<!--仓库的ID-->
			<id></id>
			<!--描述信息-->
			<name></name>
			<!--地址-->
			<url></url>
			<!--版本-->
			<releases>
				<!--是否启用-->
				<enabled>true</enabled>
				<!--从远程仓库检查依赖更新的频率,默认为daily(每天检查一次),
				naver(从不检查更新),alawys(每次构建都会检查),interval-X(每隔多少分钟检查)-->
				<updatePolicy>daily</updatePolicy>
				<!--配置检查检验和文件的策略,默认为warn(执行构建是输出警告),
				fail(遇到校验和错误就构建失败),ignore(忽略检验和错误)-->
				<checksumPolicy>warn</checksumPolicy>
			</releases>
			<!--版本-->
			<snapshots>
				<enabled>true</enabled>
				<!--从远程仓库检查依赖更新的频率,默认为daily(每天检查一次),
				naver(从不检查更新),alawys(每次构建都会检查),interval-X(每隔多少分钟检查)-->
				<updatePolicy>daily</updatePolicy>
				<!--配置检查检验和文件的策略,默认为warn(执行构建是输出警告),
				fail(遇到校验和错误就构建失败),ignore(忽略检验和错误)-->
				<checksumPolicy>warn</checksumPolicy>
			</snapshots>
			<!--仓库布局,一般有Maven1,2,3区别-->
			<layout></layout>
		</repository>
	</repositories>

	<!-- dependencyManagement一般放在父pom中,让子pom继承, 管理依赖,-->
	<!-- dependencyManagement中可以定义依赖的版本,作用域groupId、artifactId等等,
		然后在子pom中不用再声明依赖版本。同时父pom中定义的依赖用dependencyManagement来管理。
		在子pom中声明才能有效,不声明不起作用。若不使用dependencyManagement管理,则默认全部继承并有效。
		通过dependencyManagement管理依赖,更灵活-->
	<dependencyManagement>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>dubbo</artifactId>
				<version>1.2.2</version>
			</dependency>
			<!-- ................. -->
	</dependencyManagement>

	<!-- 项目构建信息的配置。。 -->
	<build>
		<!--pluginManagement的作用同dependencyManagement同理, 在父pom中配置插件管理,在子pom中声明有效 -->
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.3</version>
					<configuration>
						<source>1.8</source>
						<target>1.8</target>
						<encoding>UTF-8</encoding>
						<testIncludes>
							<testInclude>none</testInclude>
						</testIncludes>
					</configuration>
				</plugin>
			<plugins>
	</build>
</project>
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

# 4. 奇妙的依赖

在日常项目开发中,常常需要引入三方或者二方库,一个项目往往需要引入很多基础库来完成;那么如何管理维护这些类库,是一个很棘手的问题,Maven提供强大的依赖类库管理,依赖仓库存储管理,在使用时仅需要按照约定配置即可自动完成加载处理,定义依赖非常简单,仅需要引入如下配置。

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<!-- 依赖的作用域 -->
		<scope>test</scope>
		<!-- 依赖类型-->
		<type>jar</type>
		<!-- 依赖是否可选 -->
		<optional>true</optional>
		<!--该标签是在<dependency></dependency>​中,排除传递依赖-->
		<exclusions>
			<exclusion>
				<groupId></groupId>
				<artifactId></artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 4.1. 依赖的作用域

在配置文件中以<scope></scope>标签方式配置

  • compile:编译依赖范围,这个是默认的依赖。该依赖,在编译、测试、运行时期都有效;
  • test:测试依赖范围,只在测试期有效;
  • provided:已提供依赖范围,该依赖只在编译、测试有效,运行时无效。由于运行时容器提供,maven不会重复引入,为了保证编译、测试可用;
  • runtime:运行时依赖范围,仅在测试、运行时有效,如JDBC驱动编译时用JDK原生规范;
  • system:系统依赖范围,一般项目依赖的类库不在仓库中(当然也可以把类库打包到仓库),在项目中手动指定,还需要显示指定;
<dependency>
    <groupId>com.rick</groupId>
    <artifactId>sdk</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/sdk-1.0.0.jar</systemPath>
</dependency>
1
2
3
4
5
6
7
  • import:导入依赖范围,没有生命周期,一般结合 <dependencyManagement></dependencyManagement> 使用。

依赖范围

# 4.2. 传递性依赖

指项目依赖一个类库,同时这个类库又有其他的类库依赖。如A->B,B->C,则A->C,A 对 C 的依赖就是传递性依赖。

传递性依赖的原则:最短路径近原则、第一声明优先原则(maven对依赖的调节方式)。如:
A->B->C->X(1.0 version),A->D->X(2.0 version) 路径最短的那个版本依赖,选2.0的
A->B->X(1.0 version),A->D->X(2.0 version)  选择优先声明的依赖,这里根据B的生命先后顺序来确定
1
2
3

依赖范围影响传递依赖情况如下:

传递性依赖

注: 可选依赖是不能传递的,传递依赖的存在主要解决某些场景下,项目不同特性的实现,而这个特性可根据需求选择

1669976308361

如图A依赖B,B依据C和D类库提供两种实现,当A引入B实现特定功能时,可与选择是基于D实现还是C实现。

# 4.3. 排除依赖

依赖的排除主要是排除一下不想通过传递来过来的依赖,而是想自己声明。 这个就需要在 pom.xml 定义的依赖中声明即可,不需要指定版本。

 <!--该标签是在<dependency></dependency>​-->
 <dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<!-- 依赖的作用域 -->
		<scope>test</scope>
		<!-- 依赖类型-->
		<type>jar</type>
		<!-- 依赖是否可选 -->
		<optional>true</optional>
		<!--该标签是在<dependency></dependency>​中,排除传递依赖-->
		<exclusions>
			<exclusion>
				<groupId></groupId>
				<artifactId></artifactId>
			</exclusion>
		</exclusions>
	</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 5. setting.xml配置解析

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
   <!-- 配置本地仓库未知,默认在 ${user.home}/.m2/repository目录下-->
 <localRepository>F:/Tools/apache-maven-3.5.2/repo</localRepository>

  <!-- <offline>false</offline> 该属性表示 在通过maven执行构建时是否需要连接网络,获取依赖。 -->

  <!-- 插件组 -->
  <pluginGroups>
    <!-- pluginGroup
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
  </pluginGroups>

  <!-- 配置代理,一般出于安全考虑会使用 -->
  <proxies>
    <!-- proxy
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

  <!-- maven 连接验证配置-->
  <servers>
    <!-- server
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->

    <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->
	<server> 
       <id>tomcat</id> 
       <username>admin</username>
       <password>admin</password>
    </server>
	
	<server>
		<id>beikServer</id>
		<username>admin</username>
		<password>admin</password>
	</server>
	<server>
		<id>localServer</id>
		<username>admin</username>
		<password>admin</password>
	</server>
	
  </servers>

  <!-- 镜像配置-->
  <mirrors>
  <!--
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
     <!--
      <mirrorOf>*</mirrorOf> 匹配所有远程仓库
      <mirrorOf>external:*</mirrorOf> 匹配所有不在本机上的远程仓库
      <mirrorOf>repo1,repo2</mirrorOf> 可以使用逗号分隔多个远程仓库
      <mirrorOf>repo1,!repo2</mirrorOf> !表示非,即排除repo2
      注意这里id,若仓库需要验证,需要在server中配置,并保证ID一致
     -->
		<mirror>
			 <id>alimaven</id>
			 <mirrorOf>*</mirrorOf>
			 <name>aliyun maven</name>
			<!-- <url>http://maven.aliyun.com/nexus/content/groups/public/</url> -->
			 <url>http://218.108.7.222:10011/nexus/content/groups/public/</url>
		    </mirror>
	</mirrors>

  <!-- 配置JDK 项目仓库全局配置、插件等等-->
  <profiles>
    <!-- profile
    <profile>
      <id>jdk-1.4</id>

      <activation>
        <jdk>1.4</jdk>
      </activation>

      <repositories>
        <repository>
          <id>jdk14</id>
          <name>Repository for JDK 1.4 builds</name>
          <url>http://www.myhost.com/maven/jdk14</url>
          <layout>default</layout>
          <snapshotPolicy>always</snapshotPolicy>
        </repository>
      </repositories>
    </profile>
    -->
    <!--
      <plugin>
        <groupId>org.myco.myplugins</groupId>
        <artifactId>myplugin</artifactId>
       <configuration>
         <tomcatLocation>${tomcatPath}</tomcatLocation>
        </configuration>
      </plugin>
    <profile>
      <id>env-dev</id>
      <activation>
        <property>
          <name>target-env</name>
          <value>dev</value>
        </property>
      </activation>

      <properties>
        <tomcatPath>/path/to/tomcat/instance</tomcatPath>
      </properties>
    </profile>
    -->
  </profiles>

  <!-- activeProfiles
  <activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  </activeProfiles>
  -->
</settings>

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

# 6. 仓库

# 6.1. Maven仓库的分类

maven分类

  1. 本地仓库 本地仓库主要是用于本地依赖类库文件存储和从远程仓库下载的类库及自定义类库
  2. 远程仓库 远端服务器上的仓库
  3. 私服 一个局域网远程仓库,只限于局域网内的maven用户使用,它能够节约外网宽带,加速项目构建,部署第三方构建,提高稳定性,增强控制,降低远程中央仓库的负荷 image
  4. 中央仓库 Maven默认的远程仓库

# 6.2. 远程仓库的配置

  1. 在pom.xml中配置
<!--配置远程仓库信息-->
	<repositories>
		<repository>
			<!--仓库的ID-->
			<id></id>
			<!--描述信息-->
			<name></name>
			<!--地址-->
			<url></url>
			<!--版本-->
			<releases>
				<!--是否启用-->
				<enabled>true</enabled>
				<!--从远程仓库检查依赖更新的频率,默认为daily(每天检查一次),
				naver(从不检查更新),always(每次构建都会检查),interval-X(每隔多少分钟检查)-->
				<updatePolicy>daily</updatePolicy>
				<!--配置检查检验和文件的策略,默认为warn(执行构建是输出警告),
				fail(遇到校验和错误就构建失败),ignore(忽略检验和错误)-->
				<checksumPolicy>warn</checksumPolicy>
			</releases>
			<!--快照版本-->
			<snapshots>
				<enabled>true</enabled>
				<!--从远程仓库检查依赖更新的频率,默认为daily(每天检查一次),
				naver(从不检查更新),always(每次构建都会检查),interval-X(每隔多少分钟检查)-->
				<updatePolicy>daily</updatePolicy>
				<!--配置检查检验和文件的策略,默认为warn(执行构建是输出警告),
				fail(遇到校验和错误就构建失败),ignore(忽略检验和错误)-->
			</snapshots>
			<!--仓库布局,一般有Maven1,2,3区别-->
			<layout></layout>
		</repository>
	</repositories>
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
  1. 远程仓库认证配置
    配置需要在setting.xml中,为安全考虑。
<server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
</server>
<!--注意这里的id配置必须同项目pom文件中配置的id完全一样-->
1
2
3
4
5
6
  1. 部署项目打包文件到远程仓库
<!-- 通过distributionManagement将项目打包部署到远程仓库,一把发布部署需要进行远程仓库认证-->
	<distributionManagement>
		<!--发布版本仓库-->
		<repository>
			<id></id>
			<name></name>
			<url><url>
		</repository>
		<!--快照版本仓库-->
		<snapshotRepository>
			<id></id>
			<name></name>
			<url><url>
		</snapshotRepository>
	</distributionManagement>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  1. 仓库镜像配置(即远程仓库配置)
<mirrors>
<mirror>
    <id>nexus-aliyun</id>
    <!--配置依赖下载的方式,请求远程仓库的方式
    *(任何对远程仓库的请求都会转至对该仓库的请求),同理:
    external:*(本地除外),repo1,repo2(配置仓库repo1,repo2。多个远程仓库用逗号隔开),*,!repo1(repo2除外)-->
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
1
2
3
4
5
6
7
8
9
10
11

# 7. 生命周期

maven中的生命周期是指项目构建的经过的一些列过程,由maven中强大的插件来完成工作的。 生命周期含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤,maven中的生命周期分为3套体系。

  1. Clean
pre-clean #执行一些清理前需要完成的工作
clean #清理上一次构建生成的文件
post-clean #执行一些清理后需要完成的工作
1
2
3
  1. Default

默认生命周期很多,常用的几个如下:

compile #编译项目的主源码。编译sre/main/java 目录下的Java 文件至项目输出的主classpath 目录中
test #使用单元测试框架运行测试,测试代码不会被打包或部署
package #接受编译好的代码,打包成可发布的格式,如JAR。
install #将包安装到 Maven 本地仓库,供本地其他 Maven 项目使用
deploy #将最终的包复制到远程仓库
1
2
3
4
5
  1. Site

基于maven发布站点

pre-site #执行一些在生成项目站点之前需要完成的工作
site #生成项目站点文档
post-site #执行一些在生成项目站点之后需要完成的工作 
site-deploy #将生成的项目站点发布到服务器上
1
2
3
4

# 8. maven的聚合与继承

# 8.1. 聚合

顾名思义整和各模块,非常简单。(当在一个大型项目中,由许多的模块组成,不可能手动的构建每一个项目,这时就可以使用聚合来构建整个项目,只需要操作聚合的pom文件即可)只需要在聚合其他模块的的项目pom中加入如下代码:

<moudles>
	<moudle>moudle A</moudle><!--各个模块名称-->
	<moudle>moudle C</moudle>
	<moudle>moudle D</moudle>
	<moudle></moudle>
	<moudle></moudle>
</moudles>
1
2
3
4
5
6
7

注意: Maven中按序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖;这种依赖是不允许出现循环的,如A依赖B,B依赖C,C依赖A,构建的时候会报错。

# 8.2. 继承

继承是为了消除重复的依赖,减少构建代码的时间和工作效益(项目中每个模块中都有自己的依赖,但是有的子模块之间用的都是相同的依赖,为了减少重复的依赖,采用继承机制)。父pom配置只需要定义一个pom文件,打包方式定义为pom即可pom 子模块中继承方式如下:

<!-- parent是继承父pom -->
	<parent>
		<groupId>org.ibase4j</groupId>
		<artifactId>iBase4J</artifactId>
		<version>1.1.0</version>
		<!--定义父pom文件地址,相对地址.relativePath缺省情况下会从../pom.xml加载。
		加载顺序:首先检查pom中relativePath定义路径文件,没有在从仓库中查找-->
		<relativePath>../project/pom.xml</relativePath>
	</parent>
1
2
3
4
5
6
7
8
9

# 8.3. 依赖管理和插件管理

依赖管理和插件管理一般都在父pom中声明,方便统一配置、版本控制、管理整个项目的依赖和插件,特别方便,能够很好的解决依赖和插件版本冲突。

<!-- dependencyManagement一般放在父pom中,让子pom继承, 管理依赖,-->
	<!-- dependencyManagement中可以定义依赖的版本,作用域groupId、artifactId等等,
		然后在子pom中不用再声明依赖版本。同时父pom中定义的依赖用dependencyManagement来管理。
		在子pom中声明才能有效,不声明不起作用。若不使用dependencyManagement管理,则默认全部继承并有效。
		通过dependencyManagement管理依赖,更灵活-->
	<dependencyManagement>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>dubbo</artifactId>
				<version>1.2.2</version>
			</dependency>
			<!-- ................. -->
	</dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 项目构建信息的配置。。 -->
	<build>
		<!--pluginManagement的作用同dependencyManagement同理, 在父pom中配置插件管理,在子pom中声明有效 -->
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.3</version>
					<configuration>
						<source>1.8</source>
						<target>1.8</target>
						<encoding>UTF-8</encoding>
						<testIncludes>
							<testInclude>none</testInclude>
						</testIncludes>
					</configuration>
				</plugin>
			<plugins>
	</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 8.4. 约定尤于配置

是maven的核心设计理念。主要是指maven的构建项目的目录约束,正常情况下必须按照maven的规定构建,才能够勇maven的方式构建项目。查看maven的超级POM(位于lib/maven-model-builder-3.3.9.jar中的org\apache\maven\model下):

<directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

超级POM文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: superpom -->
 <!--超级POM文件中配置的值都是maven缺省的配置。-->
<project>
  <modelVersion>4.0.0</modelVersion>
    <!--仓库配置-->
  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
 <!--插件仓库配置-->
  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
       <!--相关约定-->
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    
     <!--插件管理-->
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.3.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
<!-- END SNIPPET: superpom -->
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

# 9. 常用命令

mvn archetype:generate 构建项目
mvn clean 项目清理
mvn compile 项目源代码的编译
mvn test 项目单元测试的编译
mvn package 项目打包
mvn install 发布项目提交到本地仓库
mvn deploy 发布项目到
mvn jetty:run : 启动jetty容器
mvn eclipse:clean : 清除eclipse的一些系统设置
mvn eclipse:eclipse : 生成 Eclipse 项目文件
mvn dependency:sources: 下载依赖包的源码
mvn dependency:tree 查看依赖树
mvn assembly:assembly 需要配assembly插件,可用于把指定文件进行打包 tar.gz,zip包

# 指定maven参数:
-DskipTests=true 默认跳过单元测试
-P local 指定profile环境local,需在pom开启资源配置

mvn --help #获取帮助
# 当不知道命令具体功能时,可以通过mvn [cmd]:help 来获取说明信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 10. 遇到的问题

# 10.1. maven 本地打包到私服

  1. 在setting.xml文件中增加用户名和密码配置(特别注意这里的ID)
 <servers>
        <!-- 用于发布正式版本 -->
        <server>
            <id>maven-repository-releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
        <!-- 用于发布快照版本 -->
        <server>
            <id>maven-repository-snapshots</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  1. 在项目的pom.xml中增加以下内容
<build>
        <plugins>
            <!-- 要将源码放上去,需要加入这个插件 -->
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <distributionManagement>
        <repository>
            <!-- 这里的ID要和setting的id一致 -->
            <id>maven-repository-releases</id>
            <url>http://ip:8081/nexus/content/repositories/thirdparty/</url>
        </repository>
        <!--这是打成快照版本的配置,如果不用这个snapshotRepository标签,打包失败,会报权限问题 -->
        <snapshotRepository>
            <id>maven-repository-snapshots</id>
            <url>http://ip:8081/nexus/content/repositories/thirdparty</url>
        </snapshotRepository>
    </distributionManagement>
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

# 10.2. 使用maven动态切换profile环境资源

  1. 加入profile配置
 <!-- Maven控制Spring Profile -->
    <profiles>
        <!--默认开启dev-->
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <build>
                <!-- 产生的构件的文件名,默认值是${artifactId}-${version} 根据需求自定义-->
                <finalName>${project.artifactId}-${project.version}</finalName>
            </build>
        </profile>
        <!--测试配置-->
        <profile>
            <id>test</id>
            <properties>
                <profileActive>test</profileActive>
            </properties>
            <build>
                <!-- 产生的构件的文件名 根据需求自定义-->
                <finalName>${project.artifactId}</finalName>
            </build>
        </profile>
        <!--生产配置-->
        <profile>
            <id>prod</id>
            <properties>
                <profileActive>prod</profileActive>
            </properties>
            <build>
                <!-- 产生的构件的文件名 根据需求自定义-->
                <finalName>${project.artifactId}</finalName>
            </build>
        </profile>
    </profiles>
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
  1. 资源构建配置
<build>
<!--项目构建名,可以在profile中自定义,profile中优先级高于当前构建配置-->
        <finalName>recharge</finalName>
        <!-- profile对资源的操作 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>application*.yml</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <!-- 是否替换@xx@表示的maven properties属性值 -->
                <filtering>true</filtering>
                <includes>
                    <include>application.yml</include>
                    <include>application-${profileActive}.yml</include>
                </includes>
            </resource>
        </resources>
</build>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  1. 属性配置
#激活Profile
spring.profiles.active=@profileActive@
1
2

# 10.3. 配置Profile仓库

<profiles>
      <profile>
            <id>huaweicloud</id>
            <repositories>
                <repository>
                    <id>releases</id>
                    <url>https://devrepo.devcloud.huaweicloud.com/02/nexus/content/repositories/a5d20e25f1d84b01a118ec4c8e03cd9c_1_0/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>snapshots</id>
                    <url>https://devrepo.devcloud.huaweicloud.com/02/nexus/content/repositories/a5d20e25f1d84b01a118ec4c8e03cd9c_2_0/</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
          <profile>
            <id>aliyun</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>https://maven.aliyun.com/repository/central</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>jcenter</id>
                    <url>https://maven.aliyun.com/repository/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>public</id>
                    <url>https://maven.aliyun.com/repository/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>google</id>
                    <url>https://maven.aliyun.com/repository/google</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>gradle-plugin</id>
                    <url>https://maven.aliyun.com/repository/gradle-plugin</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>spring</id>
                    <url>https://maven.aliyun.com/repository/spring</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                 <repository>
                    <id>spring-plugin</id>
                    <url>https://maven.aliyun.com/repository/spring-plugin</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                     <repository>
                    <id>grails-core</id>
                    <url>https://maven.aliyun.com/repository/grails-core</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                    <repository>
                    <id>apache-snapshots</id>
                    <url>https://maven.aliyun.com/repository/apache-snapshots</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
  </profiles>
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
120
121
122

# 10.4. 本地JAR打包到仓库

mvn install:install-file -DgroupId=com.alipay -DartifactId=trade-sdk -Dversion=1.0.0 -Dpackaging=jar -Dfile=alipay-trade-sdk-1.0.0.jar

# 10.5. Maven 项目每次编译默认1.5版本问题解决

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
1
2
3
4

# 11. 常用插件

Maven 官方插件列表 http://maven.apache.org/plugins/index.html (opens new window)

# 11.1. maven-javadoc-plugin

 <!--只需要在pom插件列表标签中加入相关插件即可-->
 <!--配置生成Javadoc包-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>2.10.4</version>
    <configuration>
        <encoding>UTF-8</encoding>
        <aggregate>true</aggregate>
        <charset>UTF-8</charset>
        <docencoding>UTF-8</docencoding>
    </configuration>
    <executions>
        <execution>
            <id>attach-javadocs</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 11.2. maven-source-plugin

<!--配置生成源码包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
    <execution>
        <id>attach-sources</id>
        <goals>
            <goal>jar</goal>
        </goals>
    </execution>
</executions>
 </plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 11.3. maven-assembly-plugin

maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。 maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户可以 按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>com.sprite.client.JettyClient</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <!--绑定到指定的生命周期-->
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 12. Maven版本号的约定

353644719231163

  • 主版本:表示了项目的重大架构变更。例如,Maven 2和 Maven 1 相去甚远;
  • 次版本:表示较大范围的功能增加和变化,及 Bug 修复;
  • 增量版本:一般表示重大 Bug 的修复;
  • 里程碑版本:顾名思义,这往往指某一个版本的里程碑。例如Maven3已经发布了很多里程碑版本,如3.0-alpha-1、3.0-alpha-2、3.0-eta-1 等。

# 13. 常用的maven仓库

  • Aliyun Repository:https://developer.aliyun.com/mvn/guide (opens new window)
  • Mvn Repository:https://mvnrepository.com/ (opens new window)
  • Sonatype Nexus Repository:https://search.maven.org/ (opens new window)
#Maven
上次更新: 2024/03/02, 14:21:03
Vnote笔记管理工具
Linux命令集

← Vnote笔记管理工具 Linux命令集→

最近更新
01
从0到1:开启商业与未来的秘密
11-26
02
如何阅读一本书: 读懂一本书,精于一件事
10-25
03
深入理解Lambda
06-27
更多文章>
Theme by Vdoing | Copyright © 2019-2024 uRick | CC BY 4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式