settings.xml文件仓库配置
settings.xml默认位置:${user.home}/.m2/settings.xml
本地仓库默认位置:${user.home}/.m2/repository
如下配置一个镜像一般就可以满足个人开发了。
<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">
<!-- 自定义本地仓库位置,可不配置使用默认位置 -->
<localRepository>
/Users/username/Projects/myrepository
</localRepository>
<!-- 配置一个镜像 -->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
或者配置一个远程仓库
<?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">
<localRepository>
/Users/username/Projects/myrepository
</localRepository>
<profile>
<id>central</id>
<repositories>
<repository>
<id>central</id>
<name>central</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
<!--
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors> -->
</settings>
镜像
正如其名,就是一个副本。
定义:X仓库可以提供Y仓库的所有构件,那么可以认为X是Y的一个镜像。
也就是说,任何可以从Y仓库获取的构件都可以从镜像中获取。
那都有远程仓库了,为什么还要一个镜像呢?直接配置远程仓库不更直观吗?
镜像仓库与被镜像仓库不在一个服务器上,那就可以像CDN一样,就近获取资源。比如:http://maven.net.cn/content/groups/public/ 是中央仓库http://repo1.maven.org/maven2/ 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。
配置一个镜像:
<mirrors>
<!-- 配置一个镜像 -->
<mirror>
<!-- 镜像唯一标识 -->
<id>alimaven</id>
<!-- 景象名称 -->
<name>aliyun maven</name>
<!-- 镜像服务器地址 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 被镜像的仓库 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<mirrorOf>central</mirrorOf>
即请求该标签下的仓库时,会被拦截并去上面配置的镜像服务器地址下载相应的构件。如本例,在去中央仓库(central)下载构件时,会被拦截并去aliyun下载构件。
<mirrorOf>*</mirrorOf> :匹配所有远程仓库。
<mirrorOf>external:*</mirrorOf> :匹配所有远程仓库,使用localhost与file://协议的除外,即匹配所有不在本机上的远程仓库。
<mirrorOf>repository1,repository2</mirrorOf> :匹配仓库repository1,repository2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repository1</mirrorOf> :匹配所有远程仓库,repository1除外,使用感叹号将仓库匹配中排除。
仓库分类
本地仓库:
Maven在执行编译或者测试时,如果使用依赖文件,会基于坐标使用本地仓库的依赖文件。
远程仓库:
如果本地仓库不存在此构件,或者需要查看是否有更新的构建版本,Maven就回去远程仓库查找,找到需要的构件,然后下载到本地仓库使用。如果本地仓库和远程仓库都没有找到需要的构件,Maven就会报错。
中央仓库:
最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令时下载到需要的构件。中央仓库就是这样一个默认的远程仓库。
私服:
私服是一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用。比较重要的作用是部署第三方构件(比如公司内部的构件、无法从外部仓库直接获取的构件),部署到私服仓库具体见下文。
其他公共仓库:
如:阿里云 http://maven.aliyun.com/nexus/content/groups/public
配置一个远程仓库:
<profile>
<repositories>
<!-- 配置一个远程仓库 -->
<repository>
<!-- 该仓库的唯一标志(Maven自带中央仓库名为central,如果使用该标志就会覆盖中央仓库的配置) -->
<id></id>
<!-- 仓库名 -->
<name></name>
<!-- 仓库地址(一般是http协议,可在浏览器中打开该地址浏览构件) -->
<url></url>
<!-- default表示仓库布局是Maven2及Maven3的默认布局,而非Maven1布局 -->
<layout></layout>
<!-- 发布版构件配置 -->
<releases>
<!-- true:可从该仓库下载发布版构件,false:不可从该仓库下载发布版 -->
<enabled></enabled>
<!-- 配置Maven从远程仓库检查更新的频率,默认值daily
daily:每天检查一次
never:从不检查更新
always:每次构建检查更新
interval:X 每隔X分钟检查一次更新,X为任意整数
-->
<updatePolicy></updatePolicy>
<!-- 配置Maven检查校验和文件的策略,默认值warn。(当构件被部署到Maven仓库时,会同时部署对应的校验和文件。)
warn:执行构建时输出警告信息
fail:遇到校验和错误就让构建失败
ignore:完全忽略校验和错误
-->
<checksumPolicy></checksumPolicy>
</releases>
<!-- 快照版构件配置 -->
<snapshots>
<!-- true:可从该仓库下载快照版构件,false:不可从该仓库下载快照版 -->
<enabled></enabled>
<updatePolicy></updatePolicy>
<checksumPolicy></checksumPolicy>
</snapshots>
</repository>
</repositories>
</profile>
GAV定位构件在仓库中的位置
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
pathOf()方法 根据构件信息生成其在仓库中的路径
private static final char PATH_SEPARATOR = '/';
private static final char GROUP_SEPARATOR = '.';
private static final char ARTIFACT_SEPARATOR = '-';
public String pathOf(Artifact artifact) {
ArtifactHandler artifactHandler = artifact.getArtifactHandler();
StringBuilder path = new StringBuilder(128);
path.append(formatAsDirectory(artifact.getGroupId())).append(PATH_SEPARATOR);
path.append(artifact.getArtifactId()).append(PATH_SEPARATOR);
path.append(artifact.getBaseVersion()).append(PATH_SEPARATOR);
path.append(artifact.ArtifactId()).append(ARTIFACT_SEPARATOR).append(artifact.getVersion());
if (artifact.hasClassifier()) {
path.append(ARTIFACT_SEPARATOR).append(artifact.getClassifier());
}
if (artifactHandler.getExtension() != null && artifactHandler.getExtension().length() > 0) {
path.append(GROUP_SEPARATOR).append(artifactHandler.getExtension());
}
return "";
}
private String formatAsDirectory(String directory) {
return directory.replace(GROUP_SEPARATOR, PATH_SEPARATOR);
}
仔细读一下还是挺好理解的。
G
org.mybatis.spring.boot -> org/mybatis/spring/boot
A
org/mybatis/spring/boot/mybatis-spring-boot-starter
V
org/mybatis/spring/boot/mybatis-spring-boot-starter/1.3.2
远程仓库(镜像)认证配置
<!-- 远程仓库(镜像)认证配置 -->
<servers>
<server>
<!-- 远程仓库(镜像)的id -->
<id></id>
<!-- 用户名 -->
<username></username>
<!-- 密码 -->
<password></password>
</server>
</servers>
部署至远程仓库
在pom文件中配置部署地址
<distributionManagement>
<!-- 配置一个发布版本构件的仓库 -->
<repository>
<!-- 该远程仓库的唯一标识id -->
<id>nexus-releases</id>
<!-- 名字,方便阅读 -->
<name>diy Nexus Releases</name>
<!-- 该仓库的地址 -->
<url>http://XXXX/nexus/content/repositories/releases</url>
</repository>
<!-- 配置一个快照版本构件的仓库 -->
<snapshotRepository>
<!-- 该远程仓库的唯一标识id -->
<id>nexus-snapshots</id>
<!-- 名字,方便阅读 -->
<name>diy Nexus Snapshots</name>
<!-- 该仓库的地址 -->
<url>http://XXXX/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
部署至远程仓库一般需要认证,认证同上的认证配置。
<repository></repository>发布版本仓库
<snapshotRepository></snapshotRepository>快照版本仓库
根据当前项目版本的部署到不同的仓库。如果是项目当前是快照版本就部署到快照版仓库地址,发布版本就部署到发布版本仓库地址。
快照版本
A开发X构件,同时B开发Y构件,X构件依赖于Y构件,所以X构件需要时刻获得最新的Y构件,此时就需要快照版本了。
快照版本就是为了保证获得到的快照构件是最新可用的。
版本号2.1-SNAPSHOT
发布时会自动为构件打上时间戳,如:2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。
快照版本只应该在组织内部的项目或模块间依赖使用,因为此时,组织对于这些快照版本的依赖具有完全的理解和控制权。快照版本依赖实际对应的构件随时可能变化,项目的构建就可能由于这些外部的不受控制的因素而失败。