Maven笔记 三 仓库
先导
仓库
Maven仓库就是用来存储Maven构件的地方,构件就是我们用Maven构建出来的各种包。当你的项目需要引入一个构件,就使用它在Maven世界里唯一的坐标来去仓库中获取,当你打包发布一个构件时,也会按照它唯一的坐标去发布到仓库中。
路径
比如你依赖了一个构件,groupId=org.testng, artifactId=testng, version=5.8, classifier=jdk15, packaging=jar
。
那么,它在仓库中的目录应该就是/org/testng/testng/5.8/testng-5.8-jdk5.jar
本地仓库和远程仓库
每个Maven用户都有一个本地仓库,就是你家目录下的.m2
文件夹。当引入依赖的时候,会先去本地仓库查看是否有这个构件,如果有直接用,如果没有去远程仓库缓存到本地仓库,也就是说当你使用这个依赖的时候,它一定已经在本地了。
中央仓库是maven默认提供的远程仓库,是默认情况下Maven的远程仓库。
私服就是指在本地局域网中创建一个私有的仓库服务器,然后它相当于在本地仓库和远端仓库之间建立了一个缓存仓库,这样做的好处很多
- 节省自己的网络带宽,为公司节省成本
- 加速Maven构建,因为从远端获取时间成本很高
- 部署第三方构件,因为很多构件因为版权原因不能放置在公共的远程仓库上,这时可以将其配置在私服上
- 提高稳定性,局域网比远端仓库工作的更稳定
- 降低中央仓库负荷
配置远程仓库
很多时候默认的仓库满足不了我们的需求,尤其是在这里,网络问题让我们的Maven工作的很不稳定。我们可以配置其它的远程仓库。
<repositories>
<repository>
<id>aliyunmaven</id>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>MavenCentral</id>
<url>http://repo1.maven.org/maven2/</url>
</repository>
</repositories>
id指定了仓库的唯一id,在配置文件的其他位置我们可能还要用到这个id,如认证时。name就是仓库的名字,url就是仓库的地址,layout就是仓库的布局,它的值为default,就是我们刚刚讲的那种文件夹布局格式,然后releases
和snapshot
分别指定了是否可以从远程仓库获取发布版或快照版的构件,一般情况下,建议把快照版给关闭。一会我们会介绍快照版是什么。
releases和snapshots还可以有其他的两个配置项
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
updatePolicy指定了本地仓库请求远端仓库检查更新的时间,daily代表每天检查,never从不检查,always每次构建都检查,interval:x,x分钟检查一次。
checksumPolicy指定了校验和检查文件的策略,warn为在构建时输出警告信息,fail为让整个构建失败,ignore为忽略校验。
远程仓库的验证
有时候,我们私人的或者公司的远端仓库会要求很高的安全性,他们会给用户发布一个账号和密码,让用户验证登录。可以在settings.xml中按如下方式进行配置。
<settings>
<servers>
<server>
<id>my-repo</id>
<username>repo-user</username>
<password>repo-pass</password>
</server>
</servers>
</settings>
id就是我们在repository
中指定的id。
部署至远程仓库
我们协同工作的时候,常常要向公司的代码仓库里提交自己的代码,我们可以在pom.xml
中按照如下配置:
<project>
<distributionManagement>
<id>my-repo</id>
<name>ReleaseRepo</name>
<url>http://192.168.1.100/content/repositories/release</url>
<snapshotRepository>
<id>my-repo-snapshots</id>
<name>SnapshotRepo</name>
<url>http://192.168.1.100/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
然后使用mvn clean deploy
就可以部署到对应的远程仓库。
快照版本
快照版本就是开发中每次新增一些代码后为协同工作打包的一些临时不稳定版本。
当A开发完自己的一个功能,它向SNAPSHOT仓库部署一个版本,Maven在发布的过程中会给项目打上时间戳,比如2.1-20091214.221414-13
,这样Maven能保证从SNAPSHOT仓库中中获取到最新的版本。当B去构建自己的模块时,它若引用了A的模块的SNAPSHOT版本,它会从服务器拉到A模块的最新快照,这样他们之间就可以轻松的协同工作。
所以如果不是在协同工作,千万不要使用SNAPSHOT版本,这其中包含着很多不稳定的代码。
镜像
一个仓库如果可以提供另一个仓库的所有内容,那么它就是一个镜像仓库。镜像仓库的作用就是代替另一个可能存在网络或其他问题的仓库进行工作。
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
mirrorOf
是被替换掉的仓库。这里就是用阿里云的仓库代替默认的中央仓库。
这些仓库都要在repositories
中声明。
高级配置