maven实战(三)maven仓库

时间:2022-08-13 04:04:00

当用户需要自定义仓库目录的时候,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:

<settings>
<localRepository>D:\java\repository\/localRepository>
</settings>

需要注意的是,默认情况下,~/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录$M2_HOME$/conf/settings.xml复制此文件再进行编辑。

2.远程仓库的配置

很多情况下,默认的*仓库无法满足项目的需求,可能项目需要额构建存在于另外一个远程仓库中,如JBoss Maven仓库。这时,可以在POM中配置该仓库,如下:
<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<release>
<enabled>true</enabled>
</release>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
</project>
声明了一个id为jboss的仓库。需要注意的是,Maven自带的*仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖*仓库的配置。
该配置中的releases和snapshots元素比较重要,它们用来控制Maven对于发布构件和快照版构建的下载。这里需要注意的是enabled子元素,该例子中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。

远程仓库的认证

大部分远程仓库都不需要认证,但有时候出于安全的考虑,比如公司内部构建了一个私服,就需要配置认证信息,配置认证信息与配置仓库信息不同,仓库信息可以在pom.xml文件中,认证信息必须在settings.xml文件中。 认证代码如下:
<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>
这里的关键是id元素,settings.xml中server元素的id必须和pom中需要认证的repository元素的id完全一致。换句话说,正是这个认证信息与仓库配置联系在了一起。

私服的一大作用是部署第三方构件,包括组织内部生成的构件以及一些无法从外部仓库直接获取的构件。无论日常开发中生成的构件,还是正式版本的构件,都需要部署到仓库中,供其他团队成员使用。
Maven除了能对项目进行编译、测试、打包外,还能将项目生成的构件部署到仓库中。首先需要编辑项目的pom.xml文件。配置distributionManagement元素,如下:
<project>
...
<distributionManagement>
<repository>
<id>proj-releases</id>
<name>Proj Release Repository</name>
<url>http://192.168.1.100/content/repositories/proj-release</url>
</repository>
<snapshotRepository>
<id>proj-snapshots</id>
<name>Proj Snapshot Repository</name>
<url>http://192.168.1.100/content/repositories/proj-snapshots</url>
</snapshotRepository>
</distributionManagement>
...
</project>
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。
配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构建输出的构件部署到配置对应的远程仓库。 如果当前项目的版本是发布版本就部署到发布版本的仓库,如果是快照版本就部署到快照版本的仓库。

快照版本

maven为什么要区分发布版本与快照版本呢?简单的1.0,1.1不就够了么,在此我们就可以提到SNAPSHOT到一个SNAPSHOT(快照版本)。 我们只要将版本的版本号设置为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,maven会自动为版本打上时间戳。比如2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件。这时,如果配置对于2.1-SNAPSHOT版本的依赖,当她构建模块B的时候,Maven会自动检测模块A的2.1-SNAPSHOT的最新构件,当发现有更新时便立即下载。 当项目经过完善的测试后需要发布后,就应该将快照版本改为发布版本。

镜像

如果仓库X可以提供Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从他的镜像中获取。举个例子,http://maven.net.cn/content/groups/public是*仓库http://repol.maven.org/maven2/在中国的镜像,因此,可以配置Maven使用该镜像来替代*仓库。编辑settings.xml,如下:
<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
该例中,<mirrorOf>的值为central,表示该配置为*仓库d的镜像,任何对*仓库的请求都会转至该镜像。
关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库,因此对于组织内的Maven用户来说,使用一个私服地址就等于使用了所有的外部仓库,这时可以配置一个这样的镜像:
<settings>
...
<mirrors>
<mirror>
<id>internal-repository</id>
<name>Internal Repository Manager</name>
<url>http://192.168.1.100/maven2</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
...
</settings>
该例中<mirrorOf>的值为*,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会转至http://192.168.1.100/maven2/。如果该镜像需要认证,则配置一个id为internal-repository的<server>即可。