maven学习第2节 - repository、mirror和profile

本文目录说明

  1. repository
  2. mirror
  3. profile
    • 3.1 profile的种类
    • 3.2 查看可用profile列表
    • 3.3 激活profile
    • 3.4 通过profile配置仓库

repository(仓库)

repository其实很简单,就是存放依赖的一个仓库。请看下图:

Maven仓库分为本地库和远程库。

  • 本地库: 就比如说Maven在本机的默认仓库目录: /Users/dengmx/.m2/repository, 下载好的所有依赖都会存在这个目录下。
  • 远程库: 首先Maven会有一个中央仓库,世界各地的使用者都可以从这个库中下载依赖。而私库的产生就是为了解决下载耗时和远程资源反复下载造成资源浪费的问题,它是在局域网内或本地网络能够更快速访问的地方搭建的一个仓库。

Maven项目引入依赖时,Maven会先检查本地仓库是否存在,如果不存在就去私库下载,如果私库没有,则会去中央仓库下载,并缓存在私库。

本地仓库配置

settings.xml:

1
2
3
<settings>
<localRepository>/Users/dengmx/repo</localRepository>
</settings>

远程仓库配置

settings.xml:

1
2
3
4
5
6
7
8
9
10
11
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

具体标签说明就不说了。上面这个中央仓库是Maven默认的仓库地址。可以配置多个repository。

关于pom.xml和settings.xml配置的优先级说明:

1
pom.xml > ~/.m2/settings.xml > ${Maven_install_dir}/conf/settings.xml

mirror

关于mirror(镜像),我们还是先来看一张图:

简单的来说mirror的作用就是我们下载依赖时,可以通过设置mirror,改变仓库的地址。上图就是我们在配置文件中加了一个阿里云的镜像配置,因此我们依赖的下载源就是阿里云了。这样可比通过中央仓库下载快多了。

阿里云Maven镜像配置(setting.xml):

1
2
3
4
5
6
<mirror>    
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>

其实我觉得mirror无非就是一个转发仓库的功能。接下来介绍的profile可比mirror使用起来方便多了。

profile

profile的种类

其实profile的产生主要是为了构建项目在不同环境方便地移植。我们先来看下profile的声明位置:

  • pom.xml: pom中声明的profile只对当前项目有效
  • 用户 settings.xml: 只对本机上该用户的所有Maven项目有效
  • 全局setting.xml: 对本机所有Maven项目有效

pom.xml中的profile可使用的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<distributionManagement></distributionManagement>
<dependencies></dependencies>
<dependencyManagement></dependencyManagement>
<modules></modules>
<properties></properties>
<reporting></reporting>
<build>
<plugins></plugins>
<defaultGoal></defaultGoal>
<resources></resources>
<testResources></testResources>
<finalName></finalName>
</build>
</project>

setting.xml中的profile可使用的元素:

1
2
3
4
5
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<properties></properties>
</project>

项目外部的profile配置只能影响到项目的仓库和Maven属性。

查看可用profile列表

1
mvn help:all-profiles

结果如下图:

可以看到我们可用的几个profile的id列表,来源和激活状态。

我们也可以用下面的命令直接查看我们项目目前已经激活的profile列表:

1
mvn help:active-profiles

激活profile的方式

  1. 命令行激活
    可以使用mvn命令行参数-P加上profile的id来激活profile,多个id见用逗号分隔。例如下面的命令激活了dev-x和dev-y两个profile:

    1
    mvn clean install -Pdev-x,dev-y
  2. settings.xml文件显示激活

    1
    2
    3
    4
    5
    6
    7
    <settings>
    ...
    <activeProfiles>
    <activeProfile>dev-x,dev-y</activeProfile>
    </activeProfiles>
    ...
    </settings>
  3. 系统属性激活
    用户可以配置当某系统属性存在时,自动激活profile,配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <profiles>
    <profile>
    <activation>
    <property>
    <name>test</name>
    </property>
    </activation>
    </profile>
    </profiles>

也可以进一步配置,当系统某属性等于某个值时才自动激活,配置如下:

1
2
3
4
5
6
7
8
9
10
<profiles>
<profile>
<activation>
<property>
<name>test</name>
<value>x</value>
</property>
</activation>
</profile>
</profiles>

只需要在命令行声明系统属性即可:

1
mvn clean install -Dtest=x

因此,这也是一种激活profile的方法,而且多个profile可以使用同一个系统属性来激活。

还有根据操作系统环境激活、根据文件存在与否激活、定义profile时默认指定激活等方式。这儿就不说明了。

另外在IDEA中切换profile非常方便,只需要勾选中相应profile即可。如下图:

默认此处会显示pom和settings.xml中的所有profile列表。

通过profile配置仓库

推荐一个通过profile来配置仓库的demo。先上settings.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
<?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">
<localRepository>/Users/apple/repo</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>work-nexus</id>
<url>http://${host}:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>work-nexus</id>
<url>http://${host}:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>aliyun</id>
<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>aliyun</activeProfile>
</activeProfiles>
</settings>

上面配置了两个profile, 一个是公司的私有库,一个是阿里云的Maven库。这样当要用到公司里的依赖的时候可以选择激活work-nexus,否则用aliyun的就可以了。注意将work-nexus的地址url改掉。