深入比较几种maven仓库的优先级
阅读数:3610 评论数:0
跳转到新版页面分类
应用软件
正文
一、前置知识
1、settings.xml中的proxy、server、repository、mirror
proxy | 是服务器不能直接访问外网时需要设置的代理服务。 |
server | 是服务器要打包上传私服时,设置私服的鉴权信息。 |
repository | 是服务器下载jar包的仓库地址。 |
mirror | 是用于替代仓库地址的镜像地址,它会拦截maven对远程仓库的相关请求,把请求里的远程仓库地址,重定向到mirror里面配置的地址。 |
通常我们在互联网环境开发项目,所有的jar包都需要到maven的中央仓库去取,但是中央仓库 的url地址是国外的,下载速度慢。而mirrorOf值为central即指定中央仓库的镜像。
请注意,对于给定的存储库最多只能有一个镜像,不能将单个存储存储库映射到一组镜像,即这些镜像都定义了相同的<mirrorOf>值,maven不会聚合镜像,而是简单地选择第一个匹配项,下面是一种错误的写法:
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
<mirror>
<id>wso2</id>
<mirrorOf>*</mirrorOf>
<name>wso2</name>
<url>https://dist.wso2.org/maven2/</url>
</mirror>
上面的这种写法虽然可以解决在阿里镜像找不到的jar包从私有仓库下载,但是当需要使用第二个私有仓库时,却没有办法。
正确的方式应该是把仓库地址配置到pom.xml中,settings.xml只保留阿里的镜像。
<id>
是镜像的唯一标识符。<mirrorOf>
指定了该镜像应该用来替代哪些仓库。可以使用*
来匹配所有仓库,或者可以使用仓库的 ID。特殊值external:*
表示所有远程仓库(不包括本地和中央仓库)。<url>
是镜像的 URL。
配置示例
<settings>
...
<profiles>
<profile>
<id>my-profile</id>
<repositories>
<repository>
<id>my-private-repo</id>
<url>http://my-private-repo.com/maven2</url>
</repository>
<!-- 其他仓库配置 -->
</repositories>
<pluginRepositories>
<pluginRepository>
<id>my-private-repo</id>
<url>http://my-private-repo.com/maven2</url>
</pluginRepository>
<!-- 其他插件仓库配置 -->
</pluginRepositories>
</profile>
...
</profiles>
<activeProfiles>
<activeProfile>my-profile</activeProfile>
<!-- 其他激活的配置文件 -->
</activeProfiles>
<mirrors>
<mirror>
<id>aliyun-mirror</id>
<mirrorOf>central</mirrorOf>
<name>Aliyun Central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>my-private-mirror</id>
<mirrorOf>my-private-repo</mirrorOf>
<name>Private Mirror</name>
<url>http://my-private-mirror.com/maven2</url>
</mirror>
<!-- 其他镜像配置 -->
</mirrors>
...
</settings>
二、maven的仓库可以通过以下几中方式进行设置:
即在settings.xml文件中的localRepository标签设置的值。
<localRepository>E:\JAVA\Maven</localRepository>
默认是用户家目录下面的.m2/repository目录。
settings.xml文件中通过profile标签进行设置。
当一个profile在settings.xml中处于活动状态并且在pom.xml中定义了一个相同id的profile时,settings.xml中的profile会覆盖pom.xml中的profile。
下面这段代码中,当所有的约束条件都满足的时候,就会激活这个profile。
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.6</jdk>
<os>
<name>Windows 7</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.3</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
...
</profile>
</profiles>
(1)activation
跟pom.xml中的profile一样,settings.xml中的profile也可以在特定环境下改变一些值,而这些环境是通过activation元素来指定的。
file | 表示当文件存在或不存在的时候激活,exists表示存在,missing表示不存在。 |
activeByDefault | 当其值为true的时候表示如果没有其他的profile处于激活状态的时候,该profile将被默认使用。 |
properties | 当该profile是激活状态的时候,properties下面指定的属性都可以在pom.xml中使用。 |
(2)repositories
当该profile是激活状态的时候,这里面定义的远程仓库将作为当前pom的远程仓库。
updatePolicy表示多久尝试更新一次。
<repositories>
<repository>
<id>codehausSnapshots</id>
<name>Codehaus Snapshots</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://snapshots.maven.codehaus.org/maven2</url>
<layout>default</layout>
</repository>
</repositories>
(3)pluginRepositories
定义maven插件的下载仓库。
通过settings.xml文件中mirror标签进行设置。
(1)id用来区别mirror
(2)mirrorOf
指定要拦截的仓库请求,即mirrorOf与repositoryId相同的时候优先使用mirror的地址。
mirrorOf等于*的时候,覆盖所有repository配置。
存在多个mirror配置的时候,mirrorOf等于*要放在最后
<mirrorOf>*</mirrorOf>
匹配所有仓库请求,即将所有的仓库请求都转到该镜像上
<mirrorOf>repo1,repo2</mirrorOf>
将仓库repo1和repo2的请求转到该镜像上,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1</miiroOf>
匹配所有仓库请求,repo1除外,使用感叹号将仓库从匹配中排除。
(3)url,表示该镜像的url
通过项目的pom.xml文件中repository标签进行设置。
<project>
...
<repositories>
<repository>
<id>example-snapshots</id>
<name>Example Snapshots Repository</name>
<url>http://example.com/maven2/snapshots</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>interval:1440</updatePolicy> <!-- 每天检查一次更新 -->
<checksumPolicy>fail</checksumPolicy> <!-- 校验和不匹配时失败 -->
</snapshots>
</repository>
<repository>
<id>example-repo</id>
<name>Example Repository</name>
<url>http://example.com/maven2</url>
</repository>
<!-- 更多的仓库可以按照这个格式继续添加 -->
</repositories>
...
</project>
<updatePolicy>
: 定义了多久检查一次远程仓库中快照版本的更新。可选的值包括always
、daily
(默认)、interval:X
(X 是以分钟为单位的时间间隔),或者never
。<checksumPolicy>
: 定义了如何处理校验和不匹配的情况。可选的值有fail
(遇到校验和错误时失败),或者ignore
(忽略校验和错误)。
Maven 会按照这些仓库定义的顺序来解析依赖。如果在第一个仓库中找不到所需的依赖,Maven 会继续在下一个仓库中查找,依此类推。
请注意,如果你在企业环境中工作,通常会有一个内部的仓库管理器(如 Nexus 或 Artifactory),它充当所有外部依赖的代理。在这种情况下,你通常只需要在 pom.xml
或 settings.xml
中配置这一个内部仓库。
在 pom.xml
文件中定义仓库是一个项目范围的配置,这意味着这些仓库设置只会影响当前 Maven 项目。而在 settings.xml
文件中定义的仓库设置则是用户范围的,会影响到用户所有的 Maven 项目。
三、maven仓库的优先级别如下:
本地仓库》profile私有仓库》pom中设置的远程仓库》mirror设置的远程仓库
maven自动下载依赖时,会涉及读取三个配置文件 ,分别是项目下的pom.xml文件、家目录下的.m2/settings.xml与maven全局配置settings.xml,三者的优先级:
pom.xml>/home/.m2/settings.xml>/maven_dir/conf/settings.xml
相对来说,在pom中配置maven仓库比较好,项目代码放在哪都没有问题。
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun-plugin</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
其中repository用于配置项目本身 的依赖仓库,pluginRepositories用于配置maven插件的远程仓库。