nexus 的 maven 配置
一、仓库类型
- proxy 远程仓库的代理,比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候,会现在本地查找,如果找不到,则会从远程仓库下载,然后返回给用户。
- hosted 宿主仓库,用户可以把自己的一些仓库deploy到这个仓库中
- group 仓库组,是nexus特有的概念,目的是将多个仓库整合,对用户暴露统一的地址,这样就不需要配置多个仓库地址。
比如默认生成的 central 仓库,是一个 proxy 类型的仓库,代理的是默认的 maven 中央仓库
而默认的 public 仓库则是一个 group 类的仓库
二、仓库创建
1. 阿里仓库的代理
2. 自己的 release 仓库
3. 自己的 snapshot 仓库
4. 组合仓库
这里直接利用自动创建的 public 仓库,去掉原有的 release 和 snapshot 仓库,release(s)和snapshot(s)可参考自动生成的那两个仓库名称,我的没加s,懒得处理了
三、用户创建
可直接跳过,使用默认的 admin 用户
1. 角色
权限略,直接根据已有权限创建角色
会发现我们自己创建的仓库也会自动创建相关权限数据,那么具有 group 的仓库的权限是否就获得其内部各仓库的相应权限呢,下面是对 public(release)添加除删除外的权限(我想还去除更新但保留新增不行吗?)和snapshot仓库的全部权限
这里是有点问题的,可直接拉 Create Role 的最下面添加匿名用户的 role,这样就可以访问了,但是推送API之类的不行,下面直接添加对应仓库的 read 权限最终是下载不了的
2. 创建一个开发用户
创建用户并关联角色,注意密码是用户密码而非邮箱密码
四、maven 配置
1. 密码加密
官方说明:https://maven.apache.org/guides/mini/guide-encryption.html
这里的 Master password 是生成密钥的种子?还是什么?
PS C:\Users\??\Desktop\tmp\untitled> mvn --encrypt-master-password
Master password:
{cK3TV5Ba/wUHu/qCTE/Cs7fTZCo6ZIe8oLCRaQnErN7BO+u/7Xppi4uiCqLETsv4}
在 .m2 目录下创建文件 settings-security.xml,内容如下
<settingsSecurity>
<master>{cK3TV5Ba/wUHu/qCTE/Cs7fTZCo6ZIe8oLCRaQnErN7BO+u/7Xppi4uiCqLETsv4}</master>
</settingsSecurity>
然后对我们上面的 dev-user 密码进行加密,下面输入的 Password 即为 dev-user 的明文密码,应该是使用上面生成的密钥对明文进行加密
PS C:\Users\??\Desktop\tmp\untitled> mvn --encrypt-password
Password:
{EJ0L8XOtDRIHdffd85KgqbvFnpnxzAhaM5kJafGDB0Q=}
然后在setting.xml文件中进行配置,主要是 servers 节点(有个疑问,server的id是否需要和下面配置的repository的id一致,应该要一致吧,不然怎么知道访问是使用哪个密码呢)
下面包含了 repository 的设置和 pluginRepository 的设置。
<servers>
<server>
<id>maven-public</id>
<username>user-dev</username>
<password>{EJ0L8XOtDRIHdffd85KgqbvFnpnxzAhaM5kJafGDB0Q=}</password>
</server>
<server>
<id>maven-release</id>
<username>user-dev</username>
<password>{EJ0L8XOtDRIHdffd85KgqbvFnpnxzAhaM5kJafGDB0Q=}</password>
</server>
<server>
<id>maven-snapshot</id>
<username>user-dev</username>
<password>{EJ0L8XOtDRIHdffd85KgqbvFnpnxzAhaM5kJafGDB0Q=}</password>
</server>
</servers>
<profiles>
<profile>
<id>maven-repository</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<profiles>
<profile>
<id>maven-repository</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>maven-public</id>
<name>maven-public</name>
<url>http://192.168.31.120:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
<repository>
<id>maven-release</id>
<name>maven-public</name>
<url>http://192.168.31.120:8081/repository/maven-project-release/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
<repository>
<id>maven-snapshot</id>
<name>maven-snapshot</name>
<url>http://192.168.31.120:8081/repository/maven-project-snapshot/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-public</id>
<url>http://192.168.31.120:8081/repository/maven-public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</profiles>
注意:setting.xml 中需要去掉下面的配置,这个默认的镜像拦截
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
五、尝试maven项目
IDEA 创建 maven 项目加载后,不知道是否访问了我们的仓库,不知道上面的配置是否生效
-
关闭 nexus 的匿名访问
-
IDEA 创建项目后停止 IDEA 的处理(IDEA右下角),删除本地仓库的数据,使用命令行 mvn -X 的 -X 开启 debug 日志,查看下载是否走配置的私服
-
nexus 查看是否有依赖数据
六、踩坑
1. 权限问题
就是上面所说的 Role 问题,仅赋予角色对应仓库的 Read 等权限,最终 maven 拉取依赖会报 403,如下图 maven 的 debug 日志,已经优先从私服拉取了,但是拉取失败(maven 的 debug 日志并未说明是什么错误,需要到 shell 到 nexus 服务器打印访问日志)
深入待处理 OR 不处理,反正也是自己用
2. 私服拉取失败
和上面差不多,最开始我以为打印了私服的日志就是成功了的,但是实际从私服拉取数据失败它是不会报错的,当然推送API等的时候失败就会报错了,我就是配置用户名配置错误了,倒是失败的,直到我到 nexus 查询发现没有依赖包数据,才发现有问题,正确拉取到数据如下,是有文件总大小和网络下载速度的。
3. 默认镜像
maven 的 settings.xml 中是有一个默认镜像配置的,这个应该是所有的 http 请求(非https)会被处理转发到中央仓库的,而非配置的私服,需要注释掉