背景
Maven是Java项目中常用的项目管理工具,每天工作都要与Maven打交道,最近有时间了,借此机会总结Maven的使用经验
通过Maven实战总结系列文章去梳理Maven中的技术点
本篇文章主要介绍公司中的常用的Nexus私服的使用和相关的技术点
Nexus
简介
Nexus是用来帮助开发者构建Maven私服的软件(为什么要构建Maven私服可以百度),类似的软件有Apache基金会的Archiva、JFrog的Artifactory和Sonatype的Nexus
同时,Nexus也是典型的Java Web应用,Nexus是典型的Java Web应用,它有两种安装包,一种是包含Jetty容器的Bundle包,另一种是不包含Web容器的war包。
仓库组与仓库
Nexus中有多种仓库的概念,对应的也内置有多种类型的仓库,这里主要有四种类型
1.group(仓库组)
2.hosted(宿主)
3.proxy(代理)
4.virtual(虚拟)
每个仓库的格式为maven2或者maven1
此外,创建仓库时可以通过 Policy(策略) 控制该仓库是Release(发布)/Snapshot(快照)/Mix(混合)类型
这里以本人目前使用的Nexus私服仓库截图说明不同类型的仓库的用途
maven-central:该仓库代理Maven中央仓库,其策略为Release,因此只会下载和缓存中央仓库中的发布版本构件。
maven-release: 这是一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件。
maven-snapshot: 这是一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件。
3rd_party: 这是一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得版本构件。
maven-public:这是一个将不同仓库合并聚合为一个仓库组去对外提供服务
其中名称为nuget-*开头的不是Maven构建相关的仓库,这里不做赘述
这里为了帮助理解宿主仓库,代理仓库和仓库组的概念,通过下图来说明他们之间的用户和概念
从图9-4中可以看到,Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接 地从远程仓库下载并缓存构件;最后,为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容(图中用虚 线表示),它会转向其包含的宿主仓库或者代理仓库获得实际构件的内容。
实战:创建仓库和仓库组
//TODO
实战: 通过Nexus上传自定义Jar包
//TODO
Maven关联Nexus私服仓库:
setting.xml部分配置解读
当需要为Java项目添加Nexus私服上的仓库时,这里有两种方法
方法一: 针对单个Java项目配置Nexus私服仓库(注意这种方式只对当前Maven项目有效)
在项目POM中配置Nexus仓库
<repositories> <repository> <id>public-snapshots</id> <url>Nexus地址/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>public-snapshots</id> <url>http://Nexus地址/repository/maven-public/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
方法二: 针对全局Java项目配置Nexus私服仓库(推荐)
在Maven的conf目录下的settings文件中配置Nexus仓库
注意:settings.xml并支持直接配置repositories和pluginRepositories,但是Maven提供了Profile的机制让用户讲Nexus仓库配置
放到settings中的 Profile文件中
<profile> <id>public-snapshots</id> <repositories> <repository> <id>public-snapshots</id> <url>http://Nexus仓库地址/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>public-snapshots</id> <url>http://Nexus仓库地址/repository/maven-public/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public-snapshots</id> <url>http://Nexus仓库地址/repository/maven-public/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>public-snapshots</activeProfile> </activeProfiles>
该配置中使用了一个id为nexus的profile,这个profile包含了相关的仓库配置,同时配置中又使用activeProfile元素将nexus这个profile激活,
这样当执行Maven构建的时候,激活的profile会将仓库配置应用到项目中去
Maven配置仓库镜像
通过上述将Maven与Nexus关联,能够让Maven项目从Nexus私服下载构件,也就是Jar包,但是该配置无法解决某些包仍然从中央仓库下载
因此这里需要使用Maven的镜像仓库的功能,并且和Nexus私服结合起来使用,让Maven项目下载的Jar包都统一通过Nexus私服下载
首先这里说明一下settings文件中镜像仓库的配置
<mirror> <id>alimaven</id> <mirrorOf>public-snapshots</mirrorOf> <name>aliyun maven</name> <url>http://Nexus仓库地址/repository/maven-public/</url> </mirror>
<mirrorOf>的值为public-snapshots,表示该配置为Maven中ProfileId为public-snapshot的镜像,任何对于该仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。另外三个元素id、name、url与一般仓库配置无异,表示该镜像仓库的唯一标识符、名称以及地址,<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像
参考资料
Maven实战 (许晓斌)