在项目中使用Maven管理JAR包依赖,往往会出现以下状况:
1、国内访问maven默认远程中央镜像特别慢;使用阿里的镜像替代远程中央镜像;
2、阿里云镜像中缺少部分JAR包;同时使用私有仓库和公有仓库;
Maven的中央仓库很强大,绝大多数的JAR包都收录了,但也有未被收录的。遇到未收录的JAR包时,就会编译报错。
针对以上情况,我们就需要让Maven支持多仓库配置。
当只配置一个仓库时,操作比较简单,直接在Maven的settings.xml文件中进行全局配置即可,以阿里云的镜像为例:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
只用新增一个mirror配置即可。要做到单一仓库,设置mirrorOf到*。
mirrorOf中配置的星号,表示匹配所有的artifacts,也就是everything使用这里的代理地址。上面的mirrorOf配置了具体的名字,指的是repository的名字。mirrorOf 设置为central,则会覆盖maven里默认的远程仓库。
镜像配置说明:
1、id: 镜像的唯一标识;
2、name: 名称描述;
3、url: 地址;
4、mirrorOf: 指定镜像规则,什么情况下从镜像仓库拉取。其中,
*: 匹配所有,所有内容都从镜像拉取;
external:*: 除了本地缓存的所有从镜像仓库拉取;
repo,repo1: repo或者repo1,这里的repo指的仓库ID;
*,!repo1: 除了repo1的所有仓库;
全局多仓库设置,是通过修改maven的setting文件实现的。
设置思路:在setting文件中添加多个profile(也可以在一个profile中包含很多个仓库),并激活。即使是只有一个可用的profile,也需要激活。
修改maven的setting文件,设置两个仓库(以此类推,可以添加多个):
<profiles>
<profile>
<!-- id必须唯一 -->
<id>myRepository1</id>
<repositories>
<repository>
<!-- id必须唯一 -->
<id>myRepository1_1</id>
<!-- 仓库的url地址 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<!-- id必须唯一 -->
<id>myRepository2</id>
<repositories>
<repository>
<!-- id必须唯一 -->
<id>myRepository2_1</id>
<!-- 仓库的url地址 -->
<url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
通过配置activeProfiles子节点激活:
<activeProfiles>
<!-- 激活myRepository1 -->
<activeProfile>myRepository1</activeProfile>
<!-- 激活myRepository2 -->
<activeProfile>myRepository2</activeProfile>
</activeProfiles>
此时如果是在Idea中使用了本地的Maven配置,那么在项目的Maven管理中会看到类似如下图中的profile选项。
在项目中添加多个仓库,是通过修改项目中的pom文件实现的。
思路:在项目中pom文件的repositories节点(如果没有手动添加)下添加多个repository节点,每个repository节点是一个仓库。
修改项目中pom文件,设置两个仓库(以此类推,可以添加多个):
<repositories>
<repository>
<!-- id必须唯一 -->
<id>jboss-repository</id>
<!-- 见名知意即可 -->
<name>jboss repository</name>
<!-- 仓库的url地址 -->
<url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url>
</repository>
<repository>
<!-- id必须唯一 -->
<id>aliyun-repository</id>
<!-- 见名知意即可 -->
<name>aliyun repository</name>
<!-- 仓库的url地址 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
这里的id就是mirrorOf要使用的ID。
注:以上两种方式的id值均不可以为“central”,因为central表示该配置为中央库的镜像。