maven仓库配置pom中repositories属性
什么是Maven仓库
在不⽤Maven的时候,⽐如说以前我们⽤Ant构建项⽬,在项⽬⽬录下,往往会看到⼀个名为/lib的⼦⽬录,那⾥存放着各类第三⽅依赖jar ⽂件,如log4j.jar,junit.jar等等。每建⽴⼀个项⽬,你都需要建⽴这样的⼀个/lib⽬录,然后复制⼀对jar⽂件,这是很明显的重复。重复永远是噩梦的起点,多个项⽬不共⽤相同的jar⽂件,不仅会造成磁盘资源的浪费,也使得版本的⼀致性管理变得困难。此外,如果你使⽤版本管理⼯具,如SVN(你没有使⽤版本管理⼯具?马上试试SVN吧,它能帮你解决很多头疼的问题),你需要将⼤量的jar⽂件提交到代码库⾥,可是版本管理⼯具在处理⼆进制⽂件⽅⾯并不出⾊。
Maven仓库就是放置所有JAR⽂件(WAR,ZIP,POM等等)的地⽅,所有Maven项⽬可以从同⼀个Maven仓库中获取⾃⼰所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其⾃⼰的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包⽅式等等,因此Maven项⽬可以⽅便的进⾏依赖版本管理。你也不在需要提交JAR⽂件到SCM仓库中,你可以建⽴⼀个组织层次的Maven 仓库,供所有成员使⽤。
简⾔之,Maven仓库能帮助我们管理构件(主要是JAR)。
本地仓库(.m2) vs. 远程仓库(联⽹)
运⾏Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会⾸先尝试从远程仓库下载构件⾄本地仓库,然后再使⽤本地仓库的构件。
⽐如说,你的项⽬配置了junit-3.8的依赖,在你运⾏mvn test 的时候,Maven需要使⽤junit-3.8的jar⽂件,它⾸先根据坐标查本地仓库,如果到,就直接使⽤。如果没有,Maven会检查可⽤的远程仓库配置,然后逐个尝试这些远程仓库去下载junit-3.8的jar⽂件,如果远程仓库存在该⽂件,Maven会将其下载到本地仓库中,继⽽使⽤。如果尝试过所有远程仓库之后,Maven还是没能够下载到该⽂件,它就会报错。
Maven缺省的本地仓库地址为${user.home}/.m2/repository 。也就是说,⼀个⽤户会对应的拥有⼀个本地仓库。
你也可以⾃定义本地仓库的位置,修改${user.home}/.l :
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository-->
<localRepository>D:/.m2/repository</localRepository>
还可以在运⾏时指定本地仓库位置:
mvn clean install -po.local=/home/juven/myrepo/
还有⼀点需要理解的是,当我们运⾏install的时候,Maven实际上是将项⽬⽣成的构件安装到了本地仓库,也就是说,只有install了之后,其它项⽬才能使⽤此项⽬⽣成的构件。
接着了解⼀下Maven缺省的远程仓库,即Maven中央仓库:
安装好Maven之后,我们可以建⽴⼀个简单的项⽬,配置⼀些简单的依赖,然后运⾏mvn clean install,项⽬就构建好了。我们没有⼿⼯的去下载任何jar⽂件,这⼀切都是因为Maven中央仓库的存在,当Maven在本地仓库不到需要的jar⽂件时,它会查远程仓库,⽽⼀个原始的Maven安装就⾃带了⼀个远程仓库——Maven中央仓库。
这个Maven中央仓库是在哪⾥定义的呢?在我的机器上,我安装了maven-2.0.10,我可以到这个⽂件:${M2_HOME}/lib/maven-2.0.10-uber.jar ,
但是到了3.xxx版本之后在: maven安装⽬录下的:/lib/maven-model-builder-${version}.jar中
打开该⽂件,能到超级POM:\org\apache\maven\model\pom-4.l ,它是所有Maven POM的⽗POM,所有Maven项⽬继承该配置,你可以在这个POM中发现如下配置:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>repo./maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
关于远程仓库的配置,下⾯的我会详细解释,这⾥我们只要知道,中央仓库的id为central,远程url地址为
repo./maven2,它关闭了snapshot版本构件下载的⽀持。
在POM中配置远程仓库
前⾯我们看到超级POM配置了ID为central的远程仓库,我们可以在POM中配置其它的远程仓库。这样做的原因有很多,⽐如你有⼀个局域⽹的远程仓库,使⽤该仓库能⼤⼤提⾼下载速度,继⽽提⾼构建速度,也有可能你依赖的⼀个jar在central中不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。
这⾥我配置⼀个远程仓库指向中央仓库的中国镜像:
<project>
...
<repositories>
maven打包本地jar包<repository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>maven/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>maven/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
...
</project>
我们先看⼀下<repositories>的配置,你可以在它下⾯添加多个<repository> ,每个<repository>都有它唯⼀的ID,⼀个描述性的name,以及最重要的,远程仓库的url。此外,<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,⽽<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。禁⽌从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使⽤。当然,如果你想使⽤局域⽹内组织内部的仓库,你可以激活snapshot的⽀持。
关于<repositories>的更详细的配置及相关解释,请参考:www.sonatype/books/maven-
book/reference_zh/apas02s08.html。
⾄于<pluginRepositories>,这是配置Maven从什么地⽅下载插件构件(Maven的所有实际⾏为都由其插件完成)。该元素的内部配置和<repository>完全⼀样,不再解释。
在l中配置远程仓库
我们知道了如何在POM中配置远程仓库,但考虑这样的情况:在⼀个公司内部,同时进⾏这3个项⽬,⽽且以后随着这⼏个项⽬的结束,越来越多的项⽬会开始;同时,公司内部建⽴⼀个Maven仓库。我们统⼀为所有这些项⽬配置该仓库,于是不得不为每个项⽬提供同样的配置。问题出现了,这是重复 !
其实我们可以做到只配置⼀次,在哪⾥配置呢?就是l。
不过事情没有那么简单,不是简单的将POM中的<repositories>及<pluginRepositories>元素复制到l中就可以,l 不直接⽀持 这两个元素。但我们还是有⼀个并不复杂的解决⽅案,就是利⽤profile,如下:
<settings>
...
<profiles>
<profile>
<id>dev</id>
<!-- repositories and pluginRepositories here-->
</profile>
</profiles>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
...
</settings>
这⾥我们定义⼀个id为dev的profile,将所有repositories以及pluginRepositories元素放到这个profile中,
然后,使⽤<activeProfiles>元素⾃动激活该profile。这样,你就不⽤再为每个POM重复配置仓库。
使⽤profile为l添加仓库提供了⼀种⽤户全局范围的仓库配置。
使⽤镜像
如果你的地理位置附近有⼀个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使⽤唯⼀的⼀个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使⽤l中的mirror配置。
以下的mirror配置⽤maven覆盖了Maven⾃带的central:
<settings>
...
<mirrors>
<mirror>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>maven/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
这⾥唯⼀需要解释的是<mirrorOf>,这⾥我们配置central的镜像,我们也可以配置⼀个所有仓库的镜像,以保证该镜像是Maven唯⼀使⽤的仓库:
4. <mirror>
5. <id>my-org-repo</id>
6. <name>Repository in My Orgnization</name>
7. <url>192.168.1.100/maven2</url>
8. <mirrorOf>*</mirrorOf>
9. </mirror>
10. </mirrors>
11. ...
12. </settings>
关于更加⾼级的镜像配置,可以参考:/guides/mini/guide-mirror-settings.html。
分发构件⾄远程仓库
mvn install会将项⽬⽣成的构件安装到本地Maven仓库,mvn deploy⽤来将项⽬⽣成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前⽤户使⽤,在分发到远程Maven仓库之后,所有能访问该仓库的⽤户都能使⽤你的构件。
我们需要配置POM的distributionManagement来指定Maven分发构件的位置,如下:
Xml代码
1. <project>
2. ...
3. <distributionManagement>
4. <repository>
5. <id>nexus-releases</id>
6. <name>Nexus Release Repository</name>
7. <url>127.0.0.1:8080/nexus/content/repositories/releases/</url>
8. </repository>
9. <snapshotRepository>
10. <id>nexus-snapshots</id>
11. <name>Nexus Snapshot Repository</name>
12. <url>127.0.0.1:8080/nexus/content/repositories/snapshots/</url>
13. </snapshotRepository>
14. </distributionManagement>
15. ...
16. </project>
Maven区别对待release版本的构件和snapshot版本的构件,snapshot为开发过程中的版本,实时,但不稳定,release版本则⽐较稳定。Maven会根据你项⽬的版本来判断将构件分发到哪个仓库。
⼀般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。这个时候,如下在l中配置认证信息:
4. <server>
5. <id>nexus-releases</id>
6. <username>admin</username>
7. <password>admin123</password>
8. </server>
9. <server>
10. <id>nexus-snapshots</id>
11. <username>admin</username>
12. <password>admin123</password>
13. </server>
14. </servers>
15. ...
16. </settings>
需要注意的是,l中server元素下id的值必须与POM中repository或snapshotRepository下id的值完全⼀致。将认证信息放到settings下⽽⾮POM中,是因为POM往往是它⼈可见的,⽽l是本地的。
⼩结
本⽂介绍了Maven仓库,它是什么?本地仓库,远程仓库,中央仓库具体是指什么?并介绍了如何在POM中配置项⽬层次的仓库,在settings中配置⽤户层次的仓库,以及mirror。本⽂还介绍了如何安装构件到本地仓库,如何分发构件⾄仓库。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论