Maven系列-Maven仓库

seefly 2020年07月30日 70次浏览

Maven仓库

1、仓库的种类

  1. 本地仓库

    本地仓库默认位置在 %MAVEN_HOME%/.m2/repository目录下,也可以在setting.xml文件中指定仓库位置。

    在下载依赖的时候会先从本地仓库查找,如果没有才会到私服或者中央仓库下载到本地仓库。在maven的生命周期install的时候也会将构建保存到本地仓库。

  2. 远程仓库

    • 中央仓库

      由于原始的本地仓库是什么都没有的,所以maven的默认安装配置文件(%MAVEN_HOME%/lib/maven-model-builder-x.jar中/org/apache/maven/model/pom-4.0.0.xml)配置了默认的中央仓库地址。

      中央仓库上面包含了非常全面的开源java构建,但下载比较慢。

    • 私服

      私服是一种特殊的远程仓库,和内网搭建的gitlab差不多,用于保存公司内部的东西。还能提高下载速度。

    • 其他公共库

2、POM中配置远程仓库用于下载构件

如果我搭建了内网仓库用来保存公司内部使用的组件,以及提高下载速度。可以在POM文件中做如下配置来指定使用内网仓库,有些仓库需要账号密码,这个需要在setting.xml中进行配置。

注意release版本的检查更新策略一般没什么用,因为maven的构建行为是先检查本地是否有该版本的release,如果有就不会到远程仓库下载,即使配置了always,只有极少数情况下才会使用到这个更新策略,需要对应场景。

但问题又来了,项目都发布成了发行版了,难道还能在发行版上进行更新?难道不是升级一个次版本号,再声明成为一个快照版吗?我估计可能是因为发布了发行版,但有些东西忘了,也不想升级版本号,估计是这个需求。

但问题又又来了,那我直接把本地的发行版删掉不就行了。

<project>
	<repositories>
  	<repository>
        <!--任何一个仓库的id必须是唯一的,且Maven自带的仓库使用的id为central,如果其他的仓库声明使用了					该id,那么会覆盖中央仓库的配置。 -->
        <id>jboos</id>
				<!--该仓库的名字,便于阅读 -->
        <name>JBoss Repository</name>
				<!-- 该远程仓库的地址-->
        <url>http://xxxx/xxxx</url>
				<!-- 该远程仓库的发行版下载配置 -->
        <releases>
					 <!-- 如果为true,表示开启该远程仓库发行版的下载支持 -->
           <enabled> true </enabled>
						<!--远程仓库检查更新频率,默认为daily,其他的有never\always -->
					 <updatePolice>daily</updatePolice>
					 <!--检查校验和文件失败时策略,相当于md5校验?warn\fail\ignore-->
					 <checksumPolicy>ignore</checksumPolicy>
        </releases>
				<!--该远程仓库快照片下载配置-->
        <snapshots>
           <enabled>
             false
           </enabled>
        </snapshots>
        <layout>default</layout>
    </repository>
  </repositories>
</project>

3、POM中配置远程仓库用于构件发布

</project>
		
    <distributionManagement>
				
        <repository>
						<!-- 远程仓库id -->
            <id>nexus-releases</id>
						<!--名称,方便阅读-->
            <name>Nexus Release Repository</name>
						<!--地址-->
            <url>http://192.168.0.152:8088/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-releases</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://192.168.0.152:8088/content/repositories/snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
</project>

4、快照版本

每一个项目都有自己的版本,例如1.2.3.RELEASE表示这是一个稳定的发行版,1.2.4.SNAPSHOT表示这是一个不稳定版本,代码可能随时变更。当一个项目或者构件被标记为SNAPSHOT的时候,MAVEN在每次构建时都会去仓库中检查该依赖是否有了更新,有则下载替换;使用场景是这样的,在一个协作开发的项目中,模块A依赖了模块B,而模块B正在进行新功能的开发,代码随时会变更,而模块A此时正在和模块B进行联调。模块A需要及时获取最新的模块B,此时如果还是使用1.2.3这样的版本方式的话模块A是拿不到最新代码的。那么当模块B将版本号命名为 1.2.4-SNAPSHOT 这样声明为快照版的时候,maven在每次构件之前都会去检查远程仓库中是否有最新版本。

5、镜像

如果仓库A拥有仓库B的所有内容,那么A就是B的一个镜像。由于maven中央仓库在国外,所以下载起来比较慢,此时可以用国内的阿里云镜像来代替,可以在setting.xml文件中配置

<settings>
	<mirrors>
		<mirror>
			<!--同仓库-->
      <id>alimaven</id>
			<!--同仓库-->
      <name>aliyun maven</name>
			<!--同仓库-->
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
			<!--表示为中央仓库的镜像,任何对中央仓库的请求,都会转发至该镜像-->
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>
</settings>

6、镜像和仓库的区别

镜像是用来加速依赖下载的,仓库是存放构建的地方。比如说内网仓库,我们公司内部开发的一些项目jar包肯定不能放公共仓库,都是放在内网仓库,供各个项目复用。所以这个jar包在公共仓库中是找不到的,需要配置一下远程仓库地址,也就是在POM中配置repository;而镜像则是再setting中配置的对某个仓库的代理访问,加速下载。