Maven 仓库
Maven
仓库是存放各种类型的构件(artifact)和依赖包的地方。
总的来说,Maven
仓库有两种类型:
- 本地(local)——
Maven
运行的电脑上的目录。 - 远程(remote)—— 需要使用网络协议(比如:
file://
或https://
)访问的仓库。
本地仓库(Local Repository)
Maven
的本地仓库,在安装Maven
后并不会创建,它是在第一次执行maven
命令的时候才被创建。
运行Maven
的时候,Maven
所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
默认情况下,不管Linux
还是Windows
,每个用户在自己的用户目录下都有一个路径名为.m2/respository/
的仓库目录。
Maven
本地仓库默认被创建在%USER_HOME%
目录下。要修改默认位置,在%M2_HOME%\conf
目录中的settings.xml
文件中定义另一个路径。
1<localRepository>/path/to/local/repo</localRepository>
远程仓库(Remote Repository)
当声明的依赖在本地仓库中找不到时,Maven
会从远程仓库(默认是中央仓库)进行下载。
中央仓库(Central Repository)
Maven
中央仓库是由Maven
社区提供的仓库,其中包含了大量常用的库。
这个仓库由 Maven 社区管理。
不需要配置。
需要通过网络才能访问。
要浏览中央仓库的内容,Maven
社区提供了一个 URL
:http://search.maven.org/#browse
。使用这个仓库,开发人员可以搜索所有可以获取的代码库。
内部仓库(Internal Repository)
如果开发环境不允许连接互联网,那么需要自行创建一个内部仓库。
创建一个内部仓库
创建内部仓库只需要从其它远程仓库(比如:中央仓库)将所需要的构件(artifact)复制到自己的服务器上,并且目录层级结构还要保持不变。
Maven
建议使用仓库管理软件管理内部仓库,可用的仓库管理软件:
- Apache Archiva (open source)
- CloudRepo (commercial)
- Cloudsmith Package (commercial)
- Dist (commercial)
- JFrog Artifactory Open Source (open source)
- JFrog Artifactory Pro (commercial)
- MyGet (commercial)
- Sonatype Nexus OSS (open source)
- Sonatype Nexus Pro (commercial)
- packagecloud.io (commercial)
- Reposilite (open source)
如何使用?
内部仓库创建成功后,只需在pom.xml
文件中进行相关配置就可以了。
1<project>
2 ...
3 <repositories>
4 <repository>
5 <id>my-internal-site</id>
6 <url>http://myserver/repo</url>
7 </repository>
8 </repositories>
9 ...
10</project>
仓库镜像
默认情况下,maven从中央仓库下载依赖包和插件。但是,国内使用中央仓库网速很慢,为了提高速度,我们可以为中央仓库配置镜像。
需要在${user.home}/.m2/settings.xml
进行如下配置:
1<mirrors>
2 <mirror>
3 <id>alimaven</id>
4 <name>aliyun maven</name>
5 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
6 <mirrorOf>central</mirrorOf>
7 </mirror>
8</mirrors>
其中<mirrorOf>
用于指定这是谁的镜像,一个仓库最多只能有一个镜像仓库。
上面的示例中我们使用的是阿里云的maven
仓库作为中央仓库的镜像。因此,对中央仓库的请求会转发到阿里云的maven
仓库。
另外,我们可以通过配置强制Maven
使用单个仓库。
1<settings>
2 ...
3 <mirrors>
4 <mirror>
5 <id>internal-repository</id>
6 <name>Maven Repository Manager running on repo.mycompany.com</name>
7 <url>http://repo.mycompany.com/proxy</url>
8 <mirrorOf>*</mirrorOf>
9 </mirror>
10 </mirrors>
11 ...
12</settings>
上面的示例中,<mirrorOf>
的值是*
,代表这是所有仓库的镜像。换句话说,不管你在POM文件中配置的是什么仓库,最终使用的都是这个镜像仓库。
相关资料:
Introduction to Repositories
Using Mirrors for Repositories