maven - nexus repository

本文使用 docker-compose 搭建 nexus

一、安装 docker

  1. docker 环境初始化
  2. docker-compose 安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

增加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

二、安装 nexus

  1. 查找镜像
g@g:~$ docker search nexus
NAME                                         DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
sonatype/nexus3                              Sonatype Nexus Repository Manager 3             840                                     
sonatype/nexus                               Sonatype Nexus                                  434                                     [OK]
clearent/nexus                                                                               22                                      
sonatype/nexus-iq-server                     Sonatype Nexus IQ Server                        16                                      
bradbeck/nexus-https                         Dockerized version of Nexus Repo Manager 3 w…   13                                      [OK]

一般 star 数最多的版本,目前最新是 sonatype/nexus3

  1. 拉取镜像
docker pull sonatype/nexus3

三、docker 容器直接启动

  1. 简单方式
docker run -p 8081:8081 --name nexus sonatype/nexus3
  1. 指定数据卷,防止每次启动容器,容器里的数据丢失,实现容器和虚拟机数据共享

如果有容器和下面要创建的容器同名的话,先删除

docker rm <container_name>

指定虚拟机与容器共享的文件夹

mkdir /usr/local/docker/nexus/nexus-data

启动容器

docker run -p 8081:8081 --name nexus -v /usr/local/docker/nexus/nexus-data:/nexus-data snoatype/nexus3

指定数据卷后启动,可能会报一些权限错误,导致启动不起来。可能会需要修改文件夹权限

chmod 777 /usr/local/docker/nexus/nexus-data

四、docker-compose 启动 nexus 容器

  • https://github.com/sonatype/docker-nexus3/blob/master/docker-compose.yml
  1. 创建 docker-compose.yml
version: "3.8"
services:
  nexus:
    restart: "no" 
    image: sonatype/nexus3
    # container_name: nexus
    ports:
      - 8081:8081 
    volumes:
      - /usr/local/docker/nexus/nexus-data:/nexus-data
  • version : 指定docker-compose语法版本,版本不同,支持的docker也不同
  • restart
  • services : 多种服务的根节点
  • nexus : 服务名随意起,代表要创建的服务
  • restart : 容器的重启策略,有no、always、on-failure、
  • unless-stopped四种可选值。
  • image : 容器依据的镜像
  • container_name : 容器名
  • ports : 端口
  • volumes : 数据卷

注意:yml文件缩进必须用空格

五、访问 nexus

缺省管理员帐号: admin

  1. 打开浏览器,访问 http://<host address>:8081/
  2. 管理员登录密码在 /usr/local/docker/nexus/nexus-data/admin.password ,将其拷贝输入即可。
  3. 登录之后会要求修改密码,按要求修改即可。

打开 Admin / Security / Anonymous,勾选 Allow anonymous users to access the server,来允许匿名访问 Nexus 拉取 jar 包。

六、maven 项目 deploy 到私服

  1. 修改 maven/conf/settings.xml,添加用户信息,以便 jar 包上传私服时进行身份认证,
<servers>
    <server>
          <id>maven-releases</id>
          <username>admin</username>
          <password>112233</password>
    </server>
    <server>
      <id>maven-snapshots</id>
      <username>admin</username>
      <password>112233</password>
    </server>
</servers>
  • id : 为nexus的仓库名称,
  • username : nexus用户名
  • password : nexus密码
  1. 创建 maven 项目,修改 pom.xml
<distributionManagement>
    <!--快照-->
    <snapshotRepository>
        <!-- nexus 服务器中用户名: 在 settings.xml 中 <server> 的 id -->
        <id>maven-snapshots</id>
        <!-- 这个名称自己定义 -->
        <name>maven-snapshots</name>
        <url>https://nexus.xyzla.com/repository/maven-snapshots/</url>
    </snapshotRepository>
    <!--正式版本-->
    <repository>
        <id>maven-releases</id>
        <name>maven-releases</name>
        <url>https://nexus.xyzla.com/repository/maven-releases/</url>
    </repository>
</distributionManagement>
  • snapshotRepository : 快照仓库
  • repository : 发行仓库
  • id : 与上面的server的id一致
  • name : 随便
  • url : 仓库地址,从nexus中可以找到

注意:pom.xml中的 repository id 要和 settings.xml 中的 server id 保持一致。

项目发布

mvn deploy

七、 从远程仓库下载

没有配置 nexus 之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服本地项目首先去本地仓库找 jar,如果没有找到则连接私服从私服下载 jar 包,如果私服没有 jar 包私服同时作为代理服务器从中央仓库下载 jar 包,这样做的好处是一方面由私服对公司项目的依赖 jar 包统一管理,一方面提高下载速度,项目连接私服下载 jar 包的速度要比项目连接中央仓库的速度快的多。

注意,如果配置了阿里镜像,下面的配置不会生效,演示时将阿里镜像注释掉,演示完了取消注释!

  1. 配置 maven/conf/settings.xml ;文件中的注释中有配置示例,Ctrl + F 搜索关键的标签,配置到与之对应的位置即可。
<profiles>
  <!-- 下载jar包配置 -->
  <profile>
    <id>nexus</id>
    <repositories>
        <repository>
            <!-- 仓库 id,repositories 可以配置多个仓库,保证 id 不重复 -->
            <id>nexus</id>
            <name>Nexus Repository</name>
            <!--仓库地址,即 nexus 仓库组的地址 -->
            <url>https://nexus.xyzla.com/repository/maven-public/</url>
            <!--是否下载 snapshots 构件 -->
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <!--是否下载 releases 构件 -->
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <!-- 插件仓库,maven  的运行依赖插件,也需要从私服下载插件 -->
    <pluginRepositories>
        <pluginRepository>
            <id>nexus</id>
            <name>Nexus Plugin Repository</name>
            <url>https://nexus.xyzla.com/repository/maven-public/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>
  </profile>
</profiles>

可以看到 上面的 url 节点填写的都是 maven-public 组的 url,而 maven-releases, maven-snapshots, third 都包含在 maven-public 中,所以能取到三个仓库的内容。

  1. 配置 profile
 <activeProfiles>
    <activeProfile>nexus</activeProfile>
 </activeProfiles>
  1. 配置私服依赖地址
<mirrors>
    <mirror>
        <id>maven-releases</id>
        <name>nexus</name>
        <mirrorOf>!internal.repo,*</mirrorOf>
        <url>https://nexus.xyzla.com/repository/maven-public/</url>
    </mirror>
<mirrors>

maven 会根据 <version/> 中是否含有 SANPSHOT 来选择是发布到快照仓库,还是发行版仓库

项目打包

mvn clean package -Dmaven.test.skip=true 

八、jar包安装到nexus私服

有时项目开发时,一些 maven 依赖下载不下来,一直报错。这时,可以手动下载 jar 包,将其安装到 nexus 私服,再从 nexus 解决依赖问题。下面以安装 kaptcha 为例:

mvn deploy:deploy-file -DgroupId=com.google.code.kaptcha -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar -Dfile=D:\kaptcha-2.3.2.jar -Durl=http://192.168.172.141:8081/repository/third/ -DrepositoryId=third
  • DgroupId : jar包的groupId
  • Dversion : jar包的版本
  • Dfile : jar包所在位置
  • Durl : 仓库地址
  • DrepositoryId : 仓库名

这里新建了名为 third 的第三方仓库,注意要在 setting.xml 增加一个 server 节点,配置用户名和密码。同时要将 third 仓库加到 maven-public 组中,因为第十步要依赖的是 maven-public 组。将 third 加入 maven-pulic 组后,只要依赖 maven-public,便可取到 third 中的 jar 包。

  • https://blog.51cto.com/14157628/2472382
  • 开发中需要重复发版,则需要开启 release 类型仓库的对应权限设置 allow redeploy。Repostiories -> Hosted -> Deployment policy -> Allow redeploy
  • 设置代理仓库 Repostiories -> Create repository -> maven2(proxy)
  • 创建代理仓库后 添加到默认 group 中,Repositories -> maven-public
  • 开启匿名写入权限,Security -> Anonymous -> Allow Anonymous users to access the server
  • 指定 本地仓库路径 <localRepository>/home/dev/workspace/apps/maven/repo</localRepository>