maven-仓库/镜像

MAVEN版本: 3.6.1
参考: http://www.voidcn.com/article/p-kufgcswl-mv.html

maven 是什么

balabala…

maven仓库 — repository

本地仓库 VS 远程仓库
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。
如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

本地仓库

  1. Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,一个用户会对应的拥有一个本地仓库。
  2. 你也可以自定义本地仓库的位置,修改${user.home}/.m2/settings.xml 中如下内容:
<settings>
 	<localRepository>E:\maven\repositorylocalRepository>
settings>
  1. 你还可以在运行时指定本地仓库位置: mvn clean install -Dmaven.repo.local=YOUR_LOCAL_REPO

远程仓库
了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。
这个Maven中央仓库是在哪里定义的呢?
${M2_HOME}/lib/maven-model-builder-3.6.1.jar,打开该文件,能找到超级POM:/org/apache/maven/model/pom-4.0.0.xml,定义来默认对中央仓库:central.
maven-仓库/镜像_第1张图片

私服
通常,公司内部会搭建一个内部对maven仓库(私服),我们通常通过私服来获取构件,结构如下图:
maven-仓库/镜像_第2张图片

Nexus是比较常用的Maven私用服务器。

图片引用自: https://blog.csdn.net/liujiahan629629/article/details/39272321

在pom中配置远程仓库

<project>
	
   <repositories>
        <repository>
            <id>aliyunid>
            <name>aliyunname>
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>
            <releases><enabled>trueenabled>releases>
            
			
            
            <snapshots><enabled>trueenabled>snapshots>
        repository>
		 <repository>
            <id>huaweiid>
            <name>华为云name>
            <url>https://repo.huaweicloud.com/repository/maven/url>
            <releases><enabled>trueenabled>releases>
        repository>
    repositories>
    
	
	<pluginRepositories>
        <pluginRepository>
        	
         	<id>aliyunid>
        pluginRepository>
    pluginRepositories>
project>

setting.xml中配置远程仓库
我们知道了如何在POM中配置远程仓库,还可以在setting.xml中配置仓库。
但是标签内并不支持, 我们需要利用来配合使用,最终通过 来激活指定的.

<settings>
     <profiles>     
        <profile>
              <id>devid>
              <repositories>
                  <repository>
                  repository>
              repositories>
        profile>      

        <profile>
              <id>testid>
              <repositories>
                  <repository>
                  repository>
              repositories>
        profile>

         <profile>
              <id>prodid>
              <repositories>
                  <repository>
                  repository>
              repositories>
        profile>
    profiles>

     <activeProfiles>
         <activeProfile>devactiveProfile> 
         <activeProfile>testactiveProfile>  
    activeProfiles>
settings>

仓库的优先级

首先申明一个前提:本地仓库优先级最高,接下来我们在以实际上不存的构件为前提下进行测试。

前文了解到,可以在多个地方,每个地方又可以配置多个仓库,那么仓库加载的优先级是如何的呢?
下面我们来综合分析下,假设我们引用一个不存在的构件:

 <dependencies>
      <dependency>
           <groupId>org.junitgroupId>
           <artifactId>junitartifactId>
           
           <version>x.y.zversion>
       dependency>
   dependencies>

仅在pom中配置多个repository

  <repositories>
        <repository>
            <id>huaweiid>
            <name>华为云name>
            <url>https://repo.huaweicloud.com/repository/maven/url>
            <releases><enabled>trueenabled>releases>
        repository>

        <repository>
            <id>aliyunid>
            <name>阿里云name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>
            <releases><enabled>trueenabled>releases>
            
            
            <snapshots><enabled>falseenabled>snapshots>
        repository>
    repositories>

执行命令:mvn clean install -U 来强制更新,结果如下:
maven-仓库/镜像_第3张图片
通过执行结果,可以推测出:在中定义的顺序先后进行加载,最后再尝试加载中央仓库。

同事在setting.xml中配置多个仓库
在前文的基础上,在setting.xml中配置多个profile,且同时激活多个profile,配置如下:

<settings>
     <profiles>     
        <profile>
              <id>devid>
              <repositories>
              	
                <repository><id>dev2id> repository>
                <repository><id>dev1id>repository>
              repositories>
        profile>      

        <profile>
              <id>testid>
              <repositories>
                  <repository> <id>test1id> repository>
                  <repository> <id>test2id> repository>
            repositories>
        profile>

         <profile>
              <id>prodid>
               <repositories> 
                  <repository> <id>prod1id> repository>
                  <repository> <id>prod2id> repository>
           repositories>
        profile>
    profiles>


     <activeProfiles>
         <activeProfile>testactiveProfile> 
         <activeProfile>devactiveProfile> 
    activeProfiles>
settings>

执行命令:mvn clean install -U 来强制更新,结果如下:
maven-仓库/镜像_第4张图片
可以得出结论

  • 首先,加载settings.xml激活,且会按照定义的先后顺序加载
    • 内部的中的多个仓库,同样按照定义的先后顺序加载
  • 然后, 加载pom.xml中的仓库(按顺序加载)
  • 最后, 会从中央仓库尝试加载。

maven镜像-mirror

通常,有很多依赖(构件)在中央仓库(境外),由于众所周知的原因会下载的很慢,或者压根下载不到,我们可以通过代理(镜像)来实现.
通过镜像的配置mirrorOf,覆盖指定仓库的url,从而实现代理的功能。

mirror并不会影响仓库的加载顺序,而是在确定了仓库之后,改变仓库的请求地址!

配置多个mirror以及镜像的优先级

注意,镜像只能在settings.xml中配置

在前文的基础上,增加mirror配置, 同时为central中央仓库添加 三个镜像:

<settings>
       <mirrors>
        <mirror>
            <id>mirror2id>
            
            <mirrorOf>centralmirrorOf>
            
            
           <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        mirror>

          <mirror>
            <id>mirror1id>
            <mirrorOf>centralmirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        mirror>

          <mirror>
            <id>mirror3id>
            <mirrorOf>centralmirrorOf>
           <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        mirror>
    mirrors>
settings>

执行mvn clean install -U,强制更新:

maven-仓库/镜像_第5张图片
从结果可以得出结论:如果一个仓库匹配到多个mirror,会按照先后顺序进行匹配仅第一个匹配到的mirror有效.

mirrorOf -配符
通过镜像的配置mirrorOf,覆盖指定仓库的url,mirrorOf 中除了指定具体的repository配置对id,maven还支持更高级的用法:

  • * : 所有远程仓库都从该镜像获取
  • *,!repo1 : 除repo1 远程仓库以外的所有仓库都从该镜像获取
  • repo1,repo2: repo1repo2仓库都从该镜像获取
  • external:* :不在本地仓库的文件才从该镜像获取

deploy到远程仓库。

  • mvn install会将项目生成的构件安装到本地Maven仓库,
  • mvn deploy用来将项目生成的构件分发到远程Maven仓库

本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库(通常是私服)之后,你的同事才能使用到你发布的构建。
pom中配置-distributionManagement

  
    <distributionManagement>
        <snapshotRepository>
            <id>nexus-snapshotid>
            <url>http://your_company_nexus_host:port/repository/maven-snapshots/url>
        snapshotRepository>
        <repository>
            <id>nexus-releaseid>
            <url>http://your_company_nexus_host:port/repository/maven-releasesurl>
        repository>
    distributionManagement>

Maven区别对待release版本的构件和snapshot版本的构件,
- snapshot为开发过程中的版本,实时,但不稳定,会部署到仓库。
- release版本则比较稳定,会部署到仓库。

Maven会根据你项目的版本号来判断将构件分发到哪个仓库。

  • 当版本号符合*-SNAPSHOT形式时,会部署到 ,注意**-SNAPSHOT(大小写不敏感,但是 - 必须要有)**
  • 其他版本号,会部署到

setting.xml配置servers
一般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。

   
    <servers>
        <server>
            <id>nexus-snapshotid>
            <username>deploymentusername>
            <password>deployment123password>
        server>
        <server>
            <id>nexus-releaseid>
            <username>publishusername>
            <password>publish123password>
        server>
    servers>

最后使用mvn deploy部署即可。

你可能感兴趣的:(#,maven)