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

阅读数:3559 评论数: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的仓库可以通过以下几中方式进行设置:

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标签进行设置。

<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>: 定义了多久检查一次远程仓库中快照版本的更新。可选的值包括 alwaysdaily(默认)、interval:X(X 是以分钟为单位的时间间隔),或者 never
  • <checksumPolicy>: 定义了如何处理校验和不匹配的情况。可选的值有 fail(遇到校验和错误时失败),或者 ignore(忽略校验和错误)。

Maven 会按照这些仓库定义的顺序来解析依赖。如果在第一个仓库中找不到所需的依赖,Maven 会继续在下一个仓库中查找,依此类推。

请注意,如果你在企业环境中工作,通常会有一个内部的仓库管理器(如 Nexus 或 Artifactory),它充当所有外部依赖的代理。在这种情况下,你通常只需要在 pom.xmlsettings.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插件的远程仓库。




相关推荐

Nexus是maven仓库管理器,可以使用它在本地架构一个maven仓库服务器。 https://help.sonatype.com/en/download.html 可能需要借助梯子。 一、修改启

目的 在你的maven项目中创建一个Docker镜像。比方说,build过程可以为java服务输出一个可以运行该服务的Docker镜像。 步骤 有两种配置方式,一种是通过Dockerfile文件,一种

&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