Maven学习4: 私服

1. 私服

第3篇说明了仓库的分类,其中讲到了私服,私服的好处很明显,这篇继续跟着公众号学习私服的搭建、仓库管理、构件部署等知识。

1. 仓库管理软件

  1. Sonatype Nexus:

  2. JFrog Artifactory: https://jfrog.com/artifactory/

2. 搭建Nexus服务

这里学习nexus的服务搭建,JFrog的后续再写。

1. 环境

  • Centos:7.6
  • jdk:1.8u231
  • maven:3.6.3

2.搭建

  1. 下载,下载安装包到/opt/nexus目录

    [root@john nexus]# pwd
    /opt/nexus
    [root@john nexus]# ll
    total 132256
    -rw-r--r-- 1 root root 135426386 Nov 14 00:31 latest-unix.tar.gz
  2. 解压

    [root@john nexus]# tar -zxvf latest-unix.tar.gz
    [root@john nexus]# ll
    total 132264
    -rw-r--r-- 1 root root 135426386 Nov 14 00:31 latest-unix.tar.gz
    drwxr-xr-x 9 root root      4096 Dec 15 15:50 nexus-3.19.1-01
    drwxr-xr-x 3 root root      4096 Dec 15 15:50 sonatype-work
  3. 启动服务

    [root@john /]# cd /opt/nexus/nexus-3.19.1-01/bin/
    [root@john bin]# ./nexus start
  4. 开放端口

    • 编辑iptables文件

      [root@john bin]# vim /etc/sysconfig/iptables
    • 打开nexus服务默认端口8081

      # 添加一行内容
      -A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT
    • 重启防火墙

      [root@john bin]# systemctl restart iptables.service
  5. 访问nexus服务

    • 地址:http://nexus服务器ip:8081
    • 登录:

      • user: admin
      • password: 初始密码存放在/opt/nexus/sonatype-work/nexus3/admin.password文件中。
    • 修改密码

3. Nexus仓库分类

3.1 介绍

登录nexus后,发现nexus内置了三种类型的仓库。

  • 代理仓库(proxy)
  • 宿主仓库(hosted)
  • 仓库组(group)
    image.png

3.2 代理仓库(proxy)

  1. 介绍
    maven从代理仓库下载构件,代理仓库会间接地从远程仓库下载并缓存构件。
  2. 创建代理仓库,代理aliyun仓库。

    • 切换顶部菜单到server administration and configuration (设置页面)。
    • 选择Repository > Repositories,点击Create repository。
    • 选择maven2(proxy)
    • 填写Name: maven-aliyun
    • 选择Maven2 > Version Policy:表示该仓库为发布版本(Release)仓库还是快照(Snapshot)版本仓库,这里选择Release。
    • 填写Proxy > Remote storage :阿里云仓库地址(https://maven.aliyun.com/repository/public,该地址是个仓库组,具体可查看https://maven.aliyun.com/mvn/view)
    • 点击底部的Create repository,完成代理仓库的创建。

3.3 宿主仓库

  1. 介绍
    宿主仓库主要是储存组织内部的,或者一些无法从公共仓库获得的第三方构件,供大家下载使用。
  2. 创建宿主仓库

    • 选择Repository > Repositories,点击Create repository。
    • 选择maven2(hosted)
    • 填写Name: maven-test-releases
    • 选择Maven2 > Version Policy:这里选择Relase,表明该仓库为发布版本仓库。
    • 点击底部的Create repository,完成代理仓库的创建。
  3. 部署构件:

    • 手动部署:将第三方构件通过nexus中网页的方式上传到宿主仓库。
    • maven部署:将项目构件部署到指定的nexus的宿主仓库.

3.4 仓库组(group)

  1. 什么是仓库组?

    • 仓库组对多个仓库地址进行聚合,本身不包含实际内容,通过转向组内包含的宿主仓库或者代理仓库获得实际构件的内容。
  2. 为什么使用仓库组?

    • 通过访问一个仓库组就可以间接的访问这个组内所有的仓库。
    • 组内可以包括多个代理仓库或者宿主仓库。
  3. 组内仓库顺序

    • 仓库组所包含的仓库的顺序决定了仓库组遍历组内仓库的次序。
    • 一般将常用的仓库放在前面。

4. 配置maven从Nexus下载构件

4.1 项目级别的配置

  1. 在项目pom文件配置仓库(${project.basedir}/pom.xml)

    <repositories>
         <repository>
             <id>maven-nexus</id>
             <url>http://nexus服务ip:8081/repository/maven-public/</url>
             <releases>
                 <enabled>true</enabled>
             </releases>
             <snapshots>
                 <enabled>true</enabled>
             </snapshots>
         </repository>
     </repositories>
  2. 在用户配置中配置仓库认证信息(~/.m2/setting.xml

    <server>
      <!-- 注意:这里id的值和`pom.xml中repository->id`的值一致 -->
      <id>maven-nexus</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
  3. 构件下载验证

    • 删除demo1项目使用到本地仓库中的org.springframework:spring-web:5.2.1.RELEASE构件。
    • 在demo1项目根目录执行mvn compile
    • 查看命令执行结果

      [INFO] Scanning for projects...
      [INFO] 
      [INFO] -----------------------< com.john.example:demo1 >-----------------------
      [INFO] Building HellMaven 1.0
      [INFO] --------------------------------[ jar ]---------------------------------
      Downloading from maven-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom
      Downloaded from maven-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom (1.9 kB at 15 kB/s)
      ...
      [INFO] 
      [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 ---
      [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
      [INFO] Copying 0 resource
      [INFO] 
      [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 ---
      [INFO] Nothing to compile - all classes are up to date
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time:  26.582 s
      [INFO] Finished at: 2019-12-17T23:30:09+08:00
      [INFO] ------------------------------------------------------------------------

4.2 用户级别的配置(镜像)

  1. 修改用户配置文件(~/.m2/setting.xml),配置镜像

    <mirror>
      <id>mirror-nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>nexus镜像</name>
      <url>http://nexus服务ip:8081/repository/maven-public/</url>
    </mirror>
  2. 配置仓库认证信息(~/.m2/setting.xml)。

    <server>
      <!-- 注意:这里id的值和`pom.xml中repository->id`的值一致 -->
      <id>mirror-nexus</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
  3. 构件下载验证。

    • 删除项目pom文件中仓库的配置。
    • 删除demo1项目使用到本地仓库中的org.springframework:spring-web:5.2.1.RELEASE构件。
    • 在demo1项目根目录执行mvn compile
    • 查看命令执行结果

      [INFO] Scanning for projects...
      [INFO] 
      [INFO] -----------------------< com.john.example:demo1 >-----------------------
      [INFO] Building HellMaven 1.0
      [INFO] --------------------------------[ jar ]---------------------------------
      Downloading from mirror-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom
      Downloaded from mirror-nexus: http://nexus服务ip:8081/repository/maven-public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom (1.9 kB at 16 kB/s)
      [INFO] 
      [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 ---
      [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
      [INFO] Copying 0 resource
      [INFO] 
      [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 ---
      [INFO] Nothing to compile - all classes are up to date
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time:  26.202 s
      [INFO] Finished at: 2019-12-17T23:49:22+08:00
      [INFO] ------------------------------------------------------------------------

5. 部署构件到Nexus

5.1 使用maven部署构件

  1. 快照版本构件

    • 日常开发生成的快照版本构件,部署到Nexus中策略为Snapshot的宿主仓库中。
  2. 发布版本构件

    • 项目正式发布的构件,部署到Nexus中策略为Release的宿主仓库中。
  3. 项目pom配置(${project.basedir}/pom.xml)

    <distributionManagement>
        <!-- Release 仓库 -->
        <repository>
            <id>nexus-releases</id>
            <name>nexus私服中宿主仓库->存放/下载发布版本的构件</name>
            <url>http://nexus服务ip:8081/repository/maven-releases/</url>
        </repository>
    
        <!-- Snapshot 仓库 -->
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>nexus私服中宿主仓库->存放/下载快照版本的构件</name>
            <url>http://nexus服务ip:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
  4. 配置仓库认证信息(~/.m2/setting.xml

    <server>
      <!-- 注意: `id`的值和pom.xml中的`distributionManagement->repository->id`的值一致。-->
      <id>nexus-releases</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    
    <server>
      <!-- 注意: `id`的值和pom.xml中的`distributionManagement->snapshotRepository->id`的值一致。-->
      <id>nexus-snapshots</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
  5. 部署项目(mvn deploy)

    • 根据项目的版本,决定是部署到Release策略的仓库还是Snapshot策略的仓库。
    • <version>1.0-SNAPSHOT</version>: Uploaded to nexus-snapshots。
    • <version>1.0</version>: Uploaded to nexus-releases。
  6. 注意

    • snapshot版本的构件支持重复部署到私服。
    • release版本的构件默认不支持重复部署。这与要部署仓库的Deployment policy设置有关。

5.2 手动部署第三方构件

  1. 上传时,首先选择要上传构件的宿主仓库。
  2. 然后选择本地文件,输入构件坐标。
阅读 342

推荐阅读