最近更换了maven仓库后,发现仍然是从原来的仓库拉取jar包。修改settings.xml文件名等方式仍然不生效。

通过mvn help:effective-settings命令查看配置,发现与当前使用的配置文件 ~/.m2/settings.xml不一样。然后再查看全局的settings.xml(maven安装目录下),才找到了问题。原来旧的仓库配置在全局的settings.xml中也有一份。

将全局settings.xml恢复为默认配置,删除本地仓库下的jar包之后重新拉取,这次就正常了。

配置优先级

Maven仓库配置一般在3个地方:项目工程的pom.xml文件;用户配置,默认位于~/.m2/settings.xml;全局配置,即maven的settings.xml。

配置优先级从高到低:pom.xml > user settings > global settings。如果这些配置同时存在,在应用配置时,会合并它们的内容。这也是本文中一开始遇到的问题所在。如果有重复的配置,则优先级高的配置覆盖优先级低的配置。

settings.xml元素详解

settings.xml中的顶级元素如下:

<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 https://maven.apache.org/xsd/settings-1.0.0.xsd"> 
<localRepository/> 
<interactiveMode/> 
<usePluginRegistry/> 
<offline/> 
<pluginGroups/> 
<servers/> 
<mirrors/> 
<proxies/> 
<profiles/> 
<activeProfiles/> 
</settings>

localRepository
该值表示构建系统本地仓库的路径。默认为:~/.m2/repository。
interactiveMode
该值表示maven是否需要和用户交互以获得输入。默认为True。
usePluginRegistry
该值表示maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。
offline
标识maven是否需要在离线模式下运行。当由于网络或安全原因,构建服务器不能连接远程仓库的时候,就需要配置该项。默认为false。
pluginGroups
当插件的组织id(groupId)没有显式提供时,供搜寻插件组织id的列表。该元素包含了一个pluginGroup元素列表,每个子元素包含了一个组织id。如下所示:

<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 https://maven.apache.org/xsd/settings-1.0.0.xsd"> 
... 
<pluginGroups> 
 <!--plugin的组织Id(groupId) --> 
 <pluginGroup>org.codehaus.mojo</pluginGroup> 
</pluginGroups> 
... 
</settings>

servers
一般,仓库的下载和部署是在pom.xml文件的repositories和distributionManager元素中定义的。但是,类似用户名,密码(有些仓库访问需要安全认证)这些敏感信息不应该在pom.xml中暴露,因此将它们配置到settings.xml中。说明如下:

<servers> <!--服务器元素包含配置服务器时需要的信息 --> 
 <server> 
	 <!--这是仓库id,该id与distributionManagement中repository元素的id相匹配。 --> 
	 <id>server001</id> 
	 <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
	 <username>my_login</username>
	 <password>my_password</password>
	 <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa),
	 这几个配置项是可选的-->
	 <!--
	 <privateKey>${usr.home}/.ssh/id_dsa</privateKey>
	 <passphrase>some_passphrase</passphrase>
	 <!--文件被创建时的权限。当库文件或者目录创建后,需要使用权限进行访问--> 
	 <filePermissions>664</filePermissions>
	 <directoryPermissions>775</directoryPermissions>
	  --> 
 </server> 
</servers>

mirrors
表示镜像库。说明如下:

<mirrors> 
  <mirror> 
	 <!-- 该镜像的唯一标识符 --> 
	 <id>planetmirror.com</id> 
	 <!-- 镜像名称 --> 
	 <name>PlanetMirror Australia</name> 
	 <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
	 <url>http://downloads.planetmirror.com/pub/maven2</url> 
	 <!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 --> 
	 <mirrorOf>central</mirrorOf> 
 </mirror>
</mirrors>

proxies
用来配置不同的代理。说明如下:

<proxies> 
  <!--代理元素包含配置代理时需要的信息 -->
   <proxy> <!--代理的唯一定义符,用来区分不同的代理元素。 --> 
	 <id>myproxy</id> 
	 <!--该代理是否是激活的那个。true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。 --> 
	 <active>true</active>
	 <!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 --> 
	 <protocol>http</protocol> 
	 <!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。 --> 
	 <host>proxy.somewhere.com</host>
	 <!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
	 <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> 
	 <username>proxyuser</username> 
	 <!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。 --> 
	 <password>somepassword</password> 
	 <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 --> 
	 <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> 
 </proxy> 
</proxies>

profiles
根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。它包含了id、activation、repositories、pluginRepositories和 properties元素。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。说明如下:

<profiles>
  <profile> 
<!-- profile的唯一标识 --> 
<id>test</id> 
<!-- 自动触发profile的条件逻辑 --> 
<activation /> 
<!-- 扩展属性列表 --> 
<properties /> 
<!-- 远程仓库列表 --> 
<repositories /> 
<!-- 插件仓库列表 --> 
<pluginRepositories /> 
</profile> 
</profiles>

通常情况下,整个settings最主要的就是profiles元素,它指定了远程仓库地址。而profiles下最基本的,也是必须的元素是:id,repositories和pluginRepositories。
activeProfiles
手动激活profiles的列表,按照profile被应用的顺序定义activeProfiles。如下所示:

<activeProfiles> <!-- 要激活的profile id --> 	
 <activeProfile>test</activeProfile> 
</activeProfiles>

参考资料

[1].