nexus 的 maven 配置

一、仓库类型

  1. proxy 远程仓库的代理,比如说nexus配置了一个central repository的proxy,当用户向这个proxy请求一个artifact的时候,会现在本地查找,如果找不到,则会从远程仓库下载,然后返回给用户。
  2. hosted 宿主仓库,用户可以把自己的一些仓库deploy到这个仓库中
  3. group 仓库组,是nexus特有的概念,目的是将多个仓库整合,对用户暴露统一的地址,这样就不需要配置多个仓库地址。

比如默认生成的 central 仓库,是一个 proxy 类型的仓库,代理的是默认的 maven 中央仓库
image

而默认的 public 仓库则是一个 group 类的仓库
image

二、仓库创建

1. 阿里仓库的代理

image

2. 自己的 release 仓库

image

3. 自己的 snapshot 仓库

image

4. 组合仓库

这里直接利用自动创建的 public 仓库,去掉原有的 release 和 snapshot 仓库,release(s)和snapshot(s)可参考自动生成的那两个仓库名称,我的没加s,懒得处理了
image

三、用户创建

可直接跳过,使用默认的 admin 用户

1. 角色

权限略,直接根据已有权限创建角色
image

会发现我们自己创建的仓库也会自动创建相关权限数据,那么具有 group 的仓库的权限是否就获得其内部各仓库的相应权限呢,下面是对 public(release)添加除删除外的权限(我想还去除更新但保留新增不行吗?)和snapshot仓库的全部权限
这里是有点问题的,可直接拉 Create Role 的最下面添加匿名用户的 role,这样就可以访问了,但是推送API之类的不行,下面直接添加对应仓库的 read 权限最终是下载不了的
image

2. 创建一个开发用户

image
创建用户并关联角色,注意密码是用户密码而非邮箱密码
image

四、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 项目加载后,不知道是否访问了我们的仓库,不知道上面的配置是否生效

  1. 关闭 nexus 的匿名访问
    image

  2. IDEA 创建项目后停止 IDEA 的处理(IDEA右下角),删除本地仓库的数据,使用命令行 mvn -X 的 -X 开启 debug 日志,查看下载是否走配置的私服

  3. nexus 查看是否有依赖数据

六、踩坑

1. 权限问题

就是上面所说的 Role 问题,仅赋予角色对应仓库的 Read 等权限,最终 maven 拉取依赖会报 403,如下图 maven 的 debug 日志,已经优先从私服拉取了,但是拉取失败(maven 的 debug 日志并未说明是什么错误,需要到 shell 到 nexus 服务器打印访问日志)
image

image

深入待处理 OR 不处理,反正也是自己用

2. 私服拉取失败

和上面差不多,最开始我以为打印了私服的日志就是成功了的,但是实际从私服拉取数据失败它是不会报错的,当然推送API等的时候失败就会报错了,我就是配置用户名配置错误了,倒是失败的,直到我到 nexus 查询发现没有依赖包数据,才发现有问题,正确拉取到数据如下,是有文件总大小和网络下载速度的。
image

3. 默认镜像

maven 的 settings.xml 中是有一个默认镜像配置的,这个应该是所有的 http 请求(非https)会被处理转发到中央仓库的,而非配置的私服,需要注释掉
image

image

posted @ 2022-11-19 22:04  YangDanMua  阅读(3683)  评论(0编辑  收藏  举报