一、仓库类型

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

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

nexus 仓库存放路径 nexus仓库配置_数据

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

nexus 仓库存放路径 nexus仓库配置_maven_02

二、仓库创建

1. 阿里仓库的代理

nexus 仓库存放路径 nexus仓库配置_数据_03

2. 自己的 release 仓库

nexus 仓库存放路径 nexus仓库配置_nexus 仓库存放路径_04

3. 自己的 snapshot 仓库

nexus 仓库存放路径 nexus仓库配置_nexus 仓库存放路径_05

4. 组合仓库

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

nexus 仓库存放路径 nexus仓库配置_maven_06

三、用户创建

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

1. 角色

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

nexus 仓库存放路径 nexus仓库配置_nexus 仓库存放路径_07

会发现我们自己创建的仓库也会自动创建相关权限数据,那么具有 group 的仓库的权限是否就获得其内部各仓库的相应权限呢,下面是对 public(release)添加除删除外的权限(我想还去除更新但保留新增不行吗?)和snapshot仓库的全部权限

这里是有点问题的,可直接拉 Create Role 的最下面添加匿名用户的 role,这样就可以访问了,但是推送API之类的不行,下面直接添加对应仓库的 read 权限最终是下载不了的

nexus 仓库存放路径 nexus仓库配置_nexus 仓库存放路径_08

2. 创建一个开发用户

nexus 仓库存放路径 nexus仓库配置_xml_09


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

nexus 仓库存放路径 nexus仓库配置_xml_10

四、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 的匿名访问
  2. nexus 仓库存放路径 nexus仓库配置_数据_11

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

六、踩坑

1. 权限问题

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

nexus 仓库存放路径 nexus仓库配置_xml_12

nexus 仓库存放路径 nexus仓库配置_数据_13

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

2. 私服拉取失败

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

nexus 仓库存放路径 nexus仓库配置_nexus 仓库存放路径_14

3. 默认镜像

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

nexus 仓库存放路径 nexus仓库配置_xml_15

nexus 仓库存放路径 nexus仓库配置_xml_16