maven仓库配置
目录
本地仓库(.m2)
远程仓库(联网)
远程仓库(局域网私服)
镜像
本地仓库
1、运行原理
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
2、示例说明
你的项目配置了junit-3.8的依赖,在你运行mvn test 的时候,Maven需要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,如果找到,就直接使用。如果没有,Maven会检查可用的远程仓库配置,然后逐个尝试这些远程仓库去下载junit-3.8的jar文件,如果远程仓库存在该文件,Maven会将其下载到本地仓库中,继而使用。如果尝试过所有远程仓库之后,Maven还是没能够下载到该文件,它就会报错。
3、仓库位置
1. 默认仓库的存储位置:
Maven缺省的本地仓库路径为${user.home}/.m2/repository
2. 自定义修改仓库的存储位置:
可改变默认的 .m2 目录下的默认本地存储库文件夹
通过修改${user.home}/.m2/settings.xml 配置本地仓库路径 ,没有settings这个xml文件就新建,或者如下复制个;具体看图:
<localRepository>D:\repository</localRepository>
3. 运行时指定本地仓库位置:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
还有一点需要理解的是,当我们运行install的时候,Maven实际上是将项目生成的构件安装到了本地仓库,也就是说,只有install了之后,其它项目才能使用此项目生成的构件。
远程仓库(联网)
接着了解一下Maven缺省的远程仓库,即Maven中央仓库:
1、运行原理
安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvn clean install,项目就构建好了。我们没有手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。
2、仓库位置
这个Maven中央仓库是在哪里定义的呢?
- maven-2.xxx,可以找到这个文件:${M2_HOME}/lib/maven-2.0.10-uber.jar;
- maven-3.xxx版本之后,在maven可以找到这个文件:/lib/maven-model-builder-
$
{version}.jar中;
打开该文件,能找到超级POM:\org\apache\maven\model\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:
1 <repositories> 2 <repository> 3 <id>central</id> 4 <name>Central Repository</name> 5 <url>https://repo.maven.apache.org/maven2</url> 6 <layout>default</layout> 7 <snapshots> 8 <enabled>false</enabled> 9 </snapshots> 10 </repository> 11 </repositories>
关于远程仓库的配置,下面的我会详细解释,这里我们只要知道,中央仓库的id为central,远程url地址为http://repo.maven.apache.org/maven2,它关闭了snapshot版本构件下载的支持。
远程仓库(私服)
在POM中配置远程仓库
前面我们看到超级POM配置了ID为central的远程仓库,我们可以在POM中配置其它的远程仓库。这样做的原因有很多,比如你有一个局域网的远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置。
1、pom.xml中配置远程仓库
这里配置一个远程仓库指向中央仓库的中国镜像,需要在你的maven项目pom.xml文件中增加:
1 <project> 2 ... 3 <repositories> 4 <repository> 5 <id>maven-net-cn</id> 6 <name>Maven China Mirror</name> 7 <url>http://maven.net.cn/content/groups/public/</url> 8 <releases> 9 <enabled>true</enabled> 10 </releases> 11 <snapshots> 12 <enabled>false</enabled> 13 </snapshots> 14 </repository> 15 </repositories> 16 <pluginRepositories> 17 <pluginRepository> 18 <id>maven-net-cn</id> 19 <name>Maven China Mirror</name> 20 <url>http://maven.net.cn/content/groups/public/</url> 21 <releases> 22 <enabled>true</enabled> 23 </releases> 24 <snapshots> 25 <enabled>false</enabled> 26 </snapshots> 27 </pluginRepository> 28 </pluginRepositories> 29 ... 30 </project>
1.1 <repositories>讲解:
我们先看一下<repositories>的配置,你可以在它下面添加多个<repository> ,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。此外,<releases><enabled>true</enabled></releases>
告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>
告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。
1.2 <pluginRepositories>讲解:
至于,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和完全一样,不再解释。
使用镜像
需求:
- 如果你的地理位置附近有一个速度更快的central镜像;
- 你想覆盖central仓库配置;
- 你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库)
注: 如果配置了镜像,maven将不再去找中央工厂统一去找镜像地址下载
你可以使用settings.xml中的mirror配置。
以下的mirror配置用maven.net.cn覆盖了Maven自带的central:
<settings> ... <mirrors> <mirror> <id>maven-net-cn</id> <name>Maven China Mirror</name> <url>http://maven.net.cn/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> ... </settings>
备注:
1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址
2、mirrorOf等于*的时候覆盖所有repository配置
3、存在多个mirror配置的时候mirrorOf等于*放到最后
4、只配置mirrorOf为central的时候可以不用配置repository
1 <?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 <localRepository>X:\工具\maven资源\repository</localRepository> 6 <pluginGroups></pluginGroups> 7 <proxies></proxies> 8 <servers></servers> 9 <mirrors> 10 <mirror> 11 <id>nexus-aliyun</id> 12 <name>Nexus aliyun</name> 13 <mirrorOf>central</mirrorOf> 14 <url>http://maven.aliyun.com/nexus/content/groups/public</url> 15 </mirror> 16 <mirror> 17 <id>nexus-mine</id> 18 <name>Nexus mine</name> 19 <mirrorOf>*</mirrorOf> 20 <url>http://xx.xx.xx.xx/nexus/content/groups/public</url> 21 </mirror> 22 </mirrors> 23 <profiles></profiles> 24 </settings>
备注:
nexus-aliyun使用阿里云的镜像作为central中央仓库
nexus-mine作为私服,mirrorOf配置为*来提供中央仓库中不存在的jar包
settings.xml配置文件元素说明
1、proxy是服务器不能直接访问外网时需要设置的代理服务,不常用
2、server是服务器要打包上传到私服时,设置私服的鉴权信息
3、repository是服务器下载jar包的仓库地址
4、mirror是用于替代仓库地址的镜像地址