Maven对后端开发的人员来说并不陌生,但多数情况下也仅仅只是配置了镜像地址用来下载依赖包。真正遇到难解的问题,还是得要稍微深入理解一些知识例如POM、坐标、仓库、生命周期等原理,这里推荐《Maven实战》这本书,虽然很老但是很经典。
今天想总结一下仓库的优先级和失败机制的问题,启发内容来自于这篇博客:Maven仓库理解和优先级,作者的核心观点大致如下:
本地仓库 > 私服 (profile)> 远程仓库(repository)和 镜像 (mirror) > 中央仓库 (central)
镜像是一个特殊的配置,其实镜像等同与远程仓库,没有匹配远程仓库的镜像就毫无作用。所以 maven 仓库真正的优先级为:
本地仓库 > 私服(profile)> 远程仓库(repository)
接下来,通过实战进行验证和理解:
1、初始化Maven项目
首先,有两个点需要提出:
-
IDEA中的maven-reimport指令,默认使用的是用户级别的settings.xml配置,但是只在background tasks中执行,报错信息不明显,因此不推荐;而命令行中以mvn执行的指令,默认使用全局的settings.xml配置,可以通过在conf文件夹下的m2.conf文件中进行配置。
-
因此,一般是推荐全局配置和用户配置保持一致,或者IDEA调整User Settings file的配置,本文采用后者(根据实际情况判断,也有可能因为配置了环境变量等原因,命令行默认使用用户配置)。
settings.xml中内容如下,没有配置镜像中央仓库,但是配置了私服(jdk1.7-Mac下使用Nexus搭建Maven私服,jdk-1.8-Mac安装配置nexus3.0):
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers></servers>
<mirrors></mirrors>
<profiles>
<profile>
<id>mymaven</id>
<repositories>
<repository>
<id>nexus maven</id>
<url>http://localhost:8081/repository/maven-public/&