maven仓库和镜像

本文主要是针对《maven实战》书中关键知识点的学习记录,未免有纰漏或描述不到之处,建议购买阅读原书

本文涉及一些maven仓库和镜像中一些简单的概念

简介

对于maven来说,仓库只分为2类,本地仓库远程仓库。maven的规则是优先在本地仓库进行寻找,如果本地仓库没有,那么便从远程仓库进行获取。如果二者都没有,那么会报错。
比较多的情况是,maven会因为网络的原因,而仓库里并没有下载到jar包,而只有.jar.lastupdate.pom这2个文件。而查看pom.xml文件的时候也不会报错。那么久需要删除本地仓库中,这个包的目录,重新下载。

私服也属于是远程仓库,私服的目的是为了节约网络带宽,而在局域网内搭建的一个maven服务器。

本地仓库

当没有修改本地maven配置的时候,默认会在当前用户目录下的.m2/repository/下作为本地的仓库。在maven安装目录的conf下有个settings.xml的文件,可以对本地仓库的路径进行设置。

<settings>
	<localRepository>D:/maven/maven-repository/</localRepository>
</settings>

注意,其实还有一种settings是可以只针对当前用户的,就是在.m2/settings.xml,不过这个xml文件一般是不存在,需要自己手工的去创建。而conf目录下的settings文件,是一个全局的配置,是针对于所有的用户。

远程仓库

本地仓库像是我们自己的书房,我们在自己的书房里去寻找某本书,发现没有,那么久是去书店或在网上去购买。在maven世界中,书店或网上商城,都可以看做是远程仓库。
远程仓库中使用比较多的是central仓库(也是默认仓库),此外还有一些如Jboss的远程仓库,具体要根据项目的实际情况来设置。
maven默认使用central仓库,如果还需要使用其他仓库,则需要再pom.xml中进行类似下面的配置

<repositories>
	<repository>
		<id>spring-milestones</id>
		<name>Spring Milestones</name>
		<url>https://repo.spring.io/milestone</url>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
</repositories>

注意里面的snapshot的值为false,表示不从仓库中下载快照版本。因为snapshot是经常发生变化的,而我们实际使用的包,往往都希望是稳定的,这样对于我们的工程来讲是比较安全。

远程仓库的更新

与snapshot有类似作用的一个标签是release,表示对发行版本的下载。默认是true。而snapshot和release这2个标签,都有2个子元素。

<snapshots>
	<enabled>true</enabled>
	<updatePolicy>daily</updatePolicy>
	<checksumPolicy>ignore</checksumPolicy>
</snapshot>

updatePolicy表示检查更新的策略,默认是每天更新一次,其他值包括never从不检查更新;always每次构建时都检查更新;interval X, 每隔x分钟检查一次
checksumPolicy是针对于校验和,当文件被部署到远程仓库中时,会生成一份校验和的文件,有点类似数字签名,来代表这个文件没有被修改过。在maven下载的时候,会根据校验和文件来进行校验,如果校验失败,那么会根据这个属性来决定是否要进行警告。ignore则表示不进行警告,还有warn表示构建时给予警告,而fail表示会让构建变为失败。

远程仓库的认证

一般我们像私服都会是公示自己内部构建的,那么有的私服仓库可能不适用于其他部门,那么会有一个账户密码的认证。这个配置信息是存在在settings.xml中的。值得注意的是,里面的这个id,需要和你在pom.xml中配置的id要一致。

<servers>
	<server>
		<id>my-proj</id>
		<username>repo-my</username>
		<password>123123</password>
	</server>
</servers>

部署到远程仓库

在工程的pom.xml文件内,需要进行配置,而这个配置是distributionManagement元素。

<distributionManagement>
	<repository>
		<id>proj-my</id>
		<name>123</name>
		<url>http://xxx</url>
	</repository>
	<snapshotRepository>
		<id>proj-my</id>
		<name>123</name>
		<url>http://xxx</url>
	</snapshotRepository>
</distributionManagement>

snapshotRepository表示是快照版本要发布的仓库地址。一般这种部署都是需要认真的,而认证的配置就是上面说提到的。
真的要进行部署的时候,就执行mvn clean deploy 即可。

快照版本

试想,有2个部门因为某项紧急的任务需要合作,2个部门的工作需要同时展开,工作中需要将自己的功能代码发布到局域网内的私服仓库中去。如果maven没有快照的机制,那么可能在每次其中一个部门发布一个版本的时候,那么就需要通知另外的部门,将pom.xml文件中的版本号去进行修改。
显然,这是一件很麻烦的事情。
快照版本要解决的就是类似这样,可能会频发发布版本,而又不需要去修改pom.xml的情形。在发布到私服的过程中,maven会自动将snapshot进行替换,打上时间戳。那么另外的一个部门,在进行获取的时候,就可以根据时间戳来获取到最新的文件,这个检查默认是每次执行一次。
快照的版本应该只在组织内部或模块间的依赖中使用,因为快照是十分不稳定的版本,可能今天构建时可以了,但到了明天就不行。

依赖解析

  • 当依赖的范围是system时,直接从本地文件系统解析构件
  • 根据依赖坐标计算仓库路径,先尝试从本地寻找,本地没有,则从远程仓库去获取
  • 在本地仓库不存在的情况下
    • 如果依赖的构件是显示的发布版本,例如1.2.1或者1.2.-beta-1这种,则便利所有远程仓库,发现则下载。
    • 如果是RELEASE或LATEST,则基于更新策略,读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地仓库对应的元数据进行合并,得到RELEASE或LATEST的真实值
    • 如果是SNAPSHOT,读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,与本地仓库对应的元数据进行合并,得到SNAPSHOT的真实值
    • 如果最后解析得到的构件版本是时间戳格式的快照(e.g. 1.4.1-20191101.121403-3),则复制时间戳格式的文件至非时间戳格式。如SNAPSHOT。

镜像

镜像的作用和cdn很类似,因为GFW的关系,很多外国的仓库访问速度很慢或者无法访问,那么就可以借助一些国内的一些大公司提供的镜像地址来加快文件的下载,个人用的比较多的是阿里的镜像地址。

<mirrors>
   <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
</mirrors>
posted @ 2019-06-09 14:13  myCodeLikeShit  阅读(5457)  评论(1编辑  收藏  举报