深入比较几种maven仓库的优先级

阅读数:754 评论数: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只保留阿里的镜像

 

二、maven的仓库可以通过以下几中方式进行设置:

1、本地仓库

即在settings.xml文件中的localRepository标签设置的值。

<localRepository>E:\JAVA\Maven</localRepository>

默认是用户家目录下面的.m2/repository目录。

2、私服仓库

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插件的下载仓库。

3、远程仓库(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

4、远程仓库(项目指定)

通过项目的pom.xml文件中repository标签进行设置。

 

三、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插件的远程仓库。




相关推荐

&lt;mirror&gt; &lt;id&gt;alimaven&lt;/id&gt; &lt;name&gt;

Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有<stron

在pom.xml中使用distributionManagement将项目打包上传到nexus私服(maven的一种远程私有仓库)。 <pre class="language-markup

一、概述 repositories配置jar仓库,pluginRepositories配置插件仓库。 二、通过项目pom.xml配置 <repositories> <repository>

dependencyManagement 只是声明依赖,并不实际引入,只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目继承该项。 denpende

在Maven的pom.xml文件中,存在如下两种build &lt;project&gt; &lt;buil

在构建Maven项目的时候,如果没有进行特殊配置,Maven会按照 标准的目录结构查找和处理各种类型文件。 src/main/java和src/test/java <p

每个插件都都有一个&lt;skip&gt;&lt;/skip&gt;属性,maven在调用插件的时候判断这个属性的值是否是true,是true的话就跳过。 <pre class="lan

&lt;plugin&gt; &lt;groupId&gt;org.springframe

这个插件可以简化spring-boot应用的maven打包。一般把spring boot打成jar,然后可以通过java -jar命令来启动jar包。但是这样子,它就不能被其他项目模块依赖,因为