基于滴滴云 CentOS 服务器搭建 Nexus Maven 私库

本文讲解如何在滴滴云 CentOS 服务器上搭建 Maven 私库, 笔者假设读者已经对于 Maven、Java有基本的了解,已经知道如何构建一个基本的 Maven 项目。

Maven 私库在公司的协作开发中是必不可少的工具。 借助于私库可以引用公司内部工具包,提高常见 JAR 包下载速度等等。当我们开发一个工具包需要提供给其他业务方需要时,就可以将 JAR 包发布到 Maven 私库, 依赖方在 maven pom.xml 中配置该工具包的依赖即可。

接下来,将介绍常见的仓库管理软件 Nexus, 搭建一个 Maven 私库, 并使用其解决 公司内部 JAR 包的发布与引用

1.安装 Nexus

1.1 配置 Java 环境

   安装 java
   sudo yum install java-1.8.0-openjdk

配置 JAVA_HOME 环境变量 (Java 目录默认在 / usr/lib/jvm 下,配置 JDK 目录为 JAVA_HOME )

1.2 安装 Maven

   yum install maven

1.3 启动 Nexus

  1. 下载 Nexus
   wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.2-03-bundle.tar.gz
  1. 解压
   tar -zxvf nexus-2.11.2-03-bundle.tar.gz
  1. 修改 Nexus 解压目录下 bin/nexus
   设置  RUN_AS_USER=root
  1. 启动 Nexus 服务
   ./nexus start
  1. http://localhost:8081/nexus 进入 Nexus 管理界面

2. Nexus

Nexus 默认有三个用户:

  • admin:该用户拥有 Nexus 的全部权限,默认密码为 admin123
  • deployment:该用户能够访问 Nexus,浏览仓库内容、搜索、上传部署构件,但是不能对 Nexus 进行任何配置,默认密码为 deployment123
  • anonymous:该用户对应了所有未登录的匿名用户,它们可以浏览仓库并进行搜索

点击右上角 login 使用 admin, admin123 登陆可以看到
在这里插入图片描述

  • A: admin 账号登录, 注意版本 2.11
  • B: admin 进入,点击 reponsitoris 可以看到仓库列表
  • C: 在下一节将使用这两个本地仓库 发布共享 JAR 包

2.1 常见仓库类型

在上图中可以看到 group,hosted,proxy,virtual 四种仓库类型

2.1.1 Group

默认仓库列表中会有一个 public 分组,该分组默认会包括所有仓库,用户可以自行添加删除。
在这里插入图片描述

2.1.2 Hosted

Hosted 仓库用来管理组织内的 JAR 包。例如公司内新开发了一个工具包,可以上传到 hosted 类型仓库。

Releases,Snapshots 分别是 release 版和 snapshot 版的仓库

2.1.3 Poxy

本地仓库中不存在的包会到 proxy 仓库中下载,proxy 仓库需要配置远端仓库,即:到哪个仓库去下载。

2.1.4 Virtual

虚拟仓库,用来兼容 Maven1。

本节简单讲解了 Nexus 的四种仓库类型,感兴趣的读者可自行深度了解各个仓库类型的使用,下一节将使用 Nexus 自带的 Releases,Snapshots 两个本地仓库,讲解如何在公司内发布引用 JAR 包。

3. 项目实战

本节,我们将构建两个 Maven 项目 pro1, pro2 其中 pro2 引用 pro1, 我们将学会如何将项目上传到仓库,以及如何引用仓库中的项目。

3.1 Snapshots、Releases 仓库

Snapshots 仓库用来管理快照 JAR 包,例如我们在项目 pom.xml 中看到的:

       <version>0.1.SNAPSHOT</version>
       <version>0.1.RELEASE</version>

Release 版和 Snapshot 版只是使用版本后的字符串区分,在以下的配置我们均使用快照版介绍:
在这里插入图片描述

  • A: 仓库的 ID
  • B: Snapshot 或者 Release 版本
  • C: 可以使用 deploy 将 JAR 包上传到仓库。

3.2 pom.xml 配置

通过 pom.xml 中的配置,我们要将项目发布到 Snapshots 仓库中, pro1 的 pom.xml 进行以下配置:

   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>forfun</groupId>
       <artifactId>pro1</artifactId>
       <packaging>jar</packaging>
       <version>0.1-SNAPSHOT</version>
       <name>pro1</name>
       
       <dependencies>
           <dependency>
               <groupId>com.google.code.gson</groupId>
               <artifactId>gson</artifactId>
               <version>2.1</version>
           </dependency>
           <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>4.10</version>
           </dependency>
       </dependencies>
   
   	<distributionManagement>
            <repository>
                <id>releases</id>
               <name>Nexus Releases Repository</name>
              <url>http://localhost:8081/nexus/content/repositories/releases</url>
           </repository>
           <snapshotRepository>
                 <id>snapshots</id>
                 <name>Nexus Snapshots Repository</name>
                <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
           </snapshotRepository>
      </distributionManagement>
   </project>

pom.xml 配置 version 为快照版,配置 GroupID,ArtifactID 象征性的引用 Gson 和 Junit,在最后我们配置了要发布的仓库地址,其中包括 Releases, Snapshots 仓库。其中仓库的地址我们可以在仓库的 Summary 选项卡中找到。一般情况下,在公司内部使用内网 IP 地址访问Nexus,注意 Snapshots 的 ID 为 Snapshots

只配置仓库地址就可以发布吗?

当然不行! 除此之外,还需要修改默认的 Maven 配置的,在 ~/.m2/ 目录下,新建或者修改 settings.xml

配置文件添加 Nexus 的账号密码:

   <?xml version="1.0" encoding="UTF-8"?>
   <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"
             xmlns="http://maven.apache.org/SETTINGS/1.1.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <servers>
           <server>
             <id>releases</id>
             <username>admin</username>
             <password>admin123</password>
           </server>
           <server>
             <id>snapshots</id>
             <username>admin</username>
             <password>admin123</password>
           </server>
       </servers>
   </settings>

其中 Releases,Snapshots 是仓库的 ID。

发布 pro1 到 Snapshots 仓库。 ( package:打包; install:把 JAR 放到 ~/.m2 本地仓库下;deploy:发布到远程仓库)

   mvn clean package install deploy -Dmaven.test.skip=true

在这里插入图片描述
在 Nexus 上已经可以看到 pro1 已经发布 ( 在 Summary 选项卡可以看到 Snapshots 的引用地址 )。

本节讲解了将一个项目发布到远程仓库的步骤与配置,只需要在项目 pom.xml 和 Maven 默认全局配置 settings.xml 中配置仓库的地址和账号即可。

3.3 引用远程仓库项目

上一小节,我们已经掌握发布项目,本节将从 Nexus 引用已发布的项目。需要说明的是,由于我们在发布时一般会选择 mvn package install deploy 其中 install 会将 JAR 包发布到本地的 ~/.m2/repository 目录下,实际引用项目时也会优先从本地拉取。

为了验证配置的正确性,笔者在构建 pro2项目时,是在另一台服务器构建的。引用的仓库地址都不是 localhost。读者也可以在实践中也可以尝试使用不同的机器构建项目,测试是否按照期望从远程仓库获取,而不是从本地获取。

pro2 的 pom.xml 中配置了对 pro1 的依赖:

   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <groupId>forfun</groupId>
       <artifactId>pro2</artifactId>
       <packaging>jar</packaging>
       <version>0.1-SNAPSHOT</version>
       <name>pro2</name>
   
       <dependencies>
           <dependency>
               <groupId>forfun</groupId>
               <artifactId>pro1</artifactId>
               <version>0.1-SNAPSHOT</version>
           </dependency>
       </dependencies>
   
   </project>

如果我们仅仅是想引用远程仓库的项目是不需要在 pom.xml 中额外配置的,只需要在./m2/settings 配置账号密码以及仓库即可。

  <profiles>
      <profile>
          <id>p1</id>
          <repositories>
              <repository>
                  <id>snapshots</id>
                  <url>http://remoteip:8081/nexus/content/repositories/snapshots</url>
                  <releases>
                      <enabled>false</enabled>
                  </releases>
                  <snapshots>
                      <enabled>true</enabled>
                  </snapshots>
              </repository>
              <repository>
                  <id>releases</id>
                  <url>http://remoteip:8081/nexus/content/repositories/releases</url>
                  <releases>
                      <enabled>true</enabled>
                  </releases>
                  <snapshots>
                      <enabled>false</enabled>
                  </snapshots>
              </repository>
          </repositories>
      </profile>
  </profiles>
  
  <activeProfiles>
        <activeProfile>p1</activeProfile>
  </activeProfiles>

在 settings 中需要配置远端仓库的地址即可,同时还需要配置 activeProfiles, 标识启用哪个配置,实际中可配多个 profile, 通过 activeProfile 控制启动哪个。

现在我们可以利用 Nexus 发布引用 JAR 包了,但是还是有几点需要读者注意:

  1. 在本文中使用的账号都是 admin,由于 admin 账号权限过大,应该使用 deployment 账号,或者每个用户一个账号
  2. 当需要发布项目到 Nexus,需要配置远端仓库地址,实际可以通过 Maven 的 parent 引用父级项目解决的。在父级项目中配置通用的 pom.xml,子项目就不需要重复拷贝粘贴配置
  3. 私有仓库可以配置镜像策略,缓存已经下载的 JAR 包,这样可以提高速度,不需要每次都从中央仓库下载了

猜你喜欢

转载自blog.csdn.net/java060515/article/details/84941088