在前面的文章中,我们已经了解了Maven的核心概念,我们已经可以正常的使用Maven来构建项目了。
但使用中遇到问题:
1.在公司开发团队开发,有可能会遇到不能连外网的情况,使我们无法下载Maven构件
2.公司的开发团队比较大,下载的Maven构件也比较多,每人都需要连接外网的中央仓库去下载构件,外网带宽占用很大,下载速度很慢,影响工作效率。
3.一些第三方构件数量多,各项目使用比较杂,无法通过中央仓库下载,直接复制JAR包到项目上不好管理。
解决方案设想:
有没有可能在局域网内创建一个类似于Maven中央仓库的私有仓库,这个私有仓库将从Maven中央仓库或其它远程仓库下载的构件缓存起来,当用户需要时,先从私有仓库查,没有再由私有仓库向远程仓库找,下载到私有仓库。
同时允许用户上传自己的构件到私有仓库。
这样就解决了中央仓库负荷高,外网带宽占用高的问题,又可以统一使用Maven机制管理第三方构件。
目前有几个软件实现了上面的功能,它们是专门的Maven仓库管理软件(Maven私服):
1.Apache的Archiva
2.JFrog的Artifactory
3.Sonatype的Nexus
我们这章讲的是使用Nexus来构建Maven私服。
1.1 Nexus的仓库与仓库组
Nexus包含了各种类型的仓库概念,包括代理仓库(proxy)、宿主仓库(hosted)、仓库组(group)等。每一种仓库都提供了丰富实用的配置参数,用户根据需求定制。
代理仓库:主要是提供下载缓存构件和插件、如果只是从远程仓库下载构件和插件、那么代理仓库完全足够。
宿主仓库:主要用于存放项目部署的构件、或者第三方构件,用于提供下载。
仓库组:将相同策略的仓库聚合,并通过一致的地址提供服务。(因为项目有可能依赖的中央仓库的release插件和某个宿主仓库中release的插件,为了方便可以配置仓库组作为仓库,而不去单独配置两个仓库)。
仓库关系图:
远程仓库:指配置在代理仓库(proxy)的实际仓库(如:互联网上的中央仓库,JBOSS仓库,Alibaba仓库等)
从图上可以看到,Maven可以直接从宿主仓库(hosted)下载构件,也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件。
仓库组的作用,它实际是将相同性质的仓库聚合起来,对向提供一个访问地址,统一管理这些仓库,它没有实际内容,当有请求时,它会转向其包含的宿主仓库或代理仓库获得实际构件的内容。
1.2 Nexus内置的仓库
下面是Nexus默认的仓库:
我们可以看到,它有四种类型的仓库:
代理仓库(proxy)、宿主仓库(hosted)、仓库组(group),虚拟(virtual)。
但由virtaulrepository是为maven1服务的,而我们已使用maven2/3,所以不再介绍它。
对于4种类型的仓库,Maven内置了一些仓库,这些仓库用户可以不用在配置了。此外仓库还有一个属性Policy(策略),表示仓库为发布(Release)版本还是快照(Snapshot)版本仓库。即Release的仓库只保存发布版本,而Snapshot仓库只保存快照版本。
下面介绍一下Nexus默认的仓库:
Central: 代理中央仓库、策略为Release、只会下载和缓存中央仓库中的发布版本构件。
Release: 策略为Release的宿主仓库、用来部署组织内部的发布版本内容。
Snapshot: 策略为Snapshot的宿主仓库、用来部署组织内部的快照版本内容。
3rdparty: 策略为Release的宿主仓库类型、用来部署无法从公共仓库获取的第三方发布版本构件、如oracle连接驱动jar包。
ApacheSnapshot: 策略为Snapshot的代理仓库、用来代理ApacheMaven仓库的快照版本构件。
Public Repositories:该仓库将上述三个hosted类型的仓库和central仓库聚合并通过该URL对外提供服务。
1.5 配置Maven从Nexus下载构件
远程仓库对本项目有效:在项目的POM.XML中配置远程仓库
大家还记录前章节在pom.xml中配置一个JBOSS的Maven仓库了吗?
--------------------------------------------------------------------------------------------
<repositories>
<repository>
<id>jboss</id>
<name>JBossRepository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<updatePolicy>daily</updatePolicy><!--never,always,interval n -->
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy><!--fail,ignore -->
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
</repositories>
--------------------------------------------------------------------------------------------
我们把public repositories仓库组的地址作为私服的访问地址:
对于本地仓库来说,其实“私服”就是一个远程仓库,配置的方式是跟其它远程仓库是一样的。
--------------------------------------------------------------------------------------------
<repositories>
<repository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://192.168.10.100:8080/nexus2/content/groups/public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>Nexus Repository</name>
<url>http://192.168.10.100:8080/nexus2/content/groups/public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
--------------------------------------------------------------------------------------------
远程仓库对所有Maven项目有效:在settings.xml的profile元素中配置
配置中使用一个ID为nexus的profile,在profile中配置了相关的仓库信息,同时配置中又使用activeProfile元素将这个profile激活,这样当执行Maven构建时,激活的profile会将仓库配置应用到项目中去。
-------------------------------------------------------------------------------------------
<settings>
...
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>NexusRepository</name>
<url>http://192.168.10.100:8080/nexus2/content/groups/public</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>