6. Maven的私服
6.1 什么是私服
Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。一些无法从外部仓库下载到的构件,如项目组其他人员开发的 jar 包,也能从本地上传到私服供其他人使用。
建立了 Maven 私服后,当局域网内的用户需要某个构件时,会先请求本地仓库,若本地仓库不存在所需构件,则请求 Maven 私服,将所需构件下载到本地仓库,若私服中不存在所需构件,再去请求外部的远程仓库,将所需构件下载并缓存到 Maven 私服,若外部远程仓库不存在所需构件,则 Maven 直接报错。
6.2 Maven仓库管理器Nexus
6.2.1 什么是Nexus
Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为"Maven 仓库管理器"。 Sonatype Nexus 是当前最流行,使用最广泛的 Maven 仓库管理器。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。
6.2.2 Nexus仓库的类型
Nexus 默认内置了很多仓库,这些仓库可以划分为 3 种类型,每种类型的仓库用于存放特定的 jar 包,具体说明如下:
- hosted:宿主仓库。部署自己的 jar 包到这个类型的仓库中,包括 Releases 和 Snapshots 两部分,Releases 为公司内部发行版本仓库,Snapshots 为公司内部测试版本仓库。
- proxy:代理仓库,maven-central。用于代理远程的公共仓库,如 Maven 中央仓库。用户连接私服,私服自动去中央仓库下载 jar 包或者插件。
- group:仓库组,maven-public。用来合并多个 hosted/proxy 仓库,通常用于配置自己的 Maven 连接仓库组。当我们下载 jar 包时,从仓库组中的每个仓库找一遍,找到后下载。
6.2.3 Nexus实战
6.2.3.1 运行Nexus控制台
1、以管理员身份打开 cmd,进入到 nexus 安装目录的 bin 目录下,执行命令nexus /run nexus
,启动 Nexus 控制台。
启动成功:
2、访问 Nexus 工作台:http://localhost:8081/
3、登录 Nexus 工作台
输入账号(默认为 admin),密码在提示的文件中(xxxxxxxxxxxx)。在登录过程中,需要设置"使用账号和密码登录",即选择下面的选项,以提高安全性。
6.2.3.2 在私服上创建仓库
1、控制台创建仓库
在 Nexus 私服上创建 2 个仓库,myphoenix-snapshot 和 myphoenix-release,分别作为内侧仓库和发布仓库
选择 maven2(hosted):
取名为 myphoenix-release,类型为 Release,创建:
2、将新建仓库添加到仓库组
创建好 myphoenix-release 仓库后,我们可以将自己打包的 jar 包上传到 Nexus 私服。但是,我们还想让其他开发人员能够在私服上下载我们上传的 jar。这时,需要将此仓库添加到仓库组 maven-public 仓库中。
以同样的方式在 Nexus 私服上创建个人 snapshot 测试库 myphoenix-snapshot。然后,将 myphoenix-snapshot 添加到仓库组 maven-public 中去。
此时,就将个人的测试仓库和发行仓库添加到 maven-public 中了。
在后面的开发工作中,我们可以上传 jar 包到 Nexus 私服,其他开发人员可以从私服下载我们上传的 jar 包了。
3、修改私服配置的远程仓库为阿里镜像仓库
将 maven-central 中的中央仓库地址修改为阿里云远程仓库的地址。
可以看到,maven-central 默认代理的是 Maven 的中央仓库:
为了加快访问速度,我们将其修改为阿里的远程仓库:
4、修改本地机器的 Maven 配置
修改 Maven 工具访问私服。
在之前的配置中,Maven 工具直接配置了阿里的远程仓库,现在,我们将其配置为私服的地址,让 Maven 通过私服下载 jar 包。修改 settings.xml 文件:
- 修改本地仓库,创建一个新的本地仓库,方便观察到从私服下载 jar 包。
- 修改远程仓库地址为 Nexus 私服的地址。
设置访问 Nexus 私服的用户名和密码
</servers>
<server>
<id>myphoenix-nexus</id>
<username>admin</username>
<password>xxxxxxxxxxxx</password>
</server>
</servers>
删除原来配置的阿里远程仓库,重新配置 Nexus 私服地址,用于下载 jar 包
</mirrors>
<mirror>
<id>myphoenix-nexus</id>
<mirrorOf>central</mirrorOf>
<name>mynexus</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
打开项目,发现 Maven 报错,jar 包也没了:
刷新 Maven 依赖,发现 Nexus 控制台的 maven-public 中有了 jar 包:
6.2.3.3 部署jar包至私服&从私服下载jar包
上传本地 jar 包到 Nexus 私服:
1、创建 maven_nexus 模块。
2、在 maven_nexus 模块中创建一个类 Common,在 Common 类中定义一个 sayHi 方法,模拟开发的功能。
3、在 maven_nexus 的 pom.xml 文件中配置部署参数。
4、在 maven_nexus 的生命周期中,执行 deploy,分别将 Snapshot 和 Release 版本部署到私服上。
- version 为 1.0-SNAPSHOT,上传至内侧仓库。
- version 为 1.0.0,上传至发布仓库。
5、创建 maven_nexus_download 模块,模拟同组的其他开发人员,在该模块中编写测试类,尝试引入 maven_nexus 模块依赖。
pom.xml 配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.myphoenix</groupId>
<artifactId>maven_nexus</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--为项目进行部署(上传至私服)参数配置,以什么用户名和密码,上传到哪个库-->
<distributionManagement>
<!--上传至发布仓库-->
<repository>
<id>myphoenix-nexus</id>
<url>http://localhost:8081/repository/myphoenix-release/</url>
</repository>
<!--上传至内测仓库-->
<snapshotRepository>
<id>myphoenix-nexus</id>
<url>http://localhost:8081/repository/myphoenix-snapshot/</url>
</snapshotRepository>
</distributionManagement>
</project>
现将内侧版本上传至内侧仓库:
查看控制台信息:
C:\Softwares\Developer_Kits\JDK\jdk1.8.0_131\bin\ ......
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< cn.myphoenix:maven_nexus >----------------------
[INFO] Building maven_nexus 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven_nexus ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven_nexus ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\maven_nexus\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven_nexus ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\maven_nexus\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven_nexus ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven_nexus ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven_nexus ---
[INFO] Building jar: C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\maven_nexus\target\maven_nexus-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ maven_nexus ---
[INFO] Installing C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\maven_nexus\target\maven_nexus-1.0-SNAPSHOT.jar to C:\Softwares\Developer_Kits\apache-maven-3.8.8\repository\cn\myphoenix\maven_nexus\1.0-SNAPSHOT\maven_nexus-1.0-SNAPSHOT.jar
[INFO] Installing C:\Coding_Gallery\Intellij_IDEA_Workspace\learning_maven\maven_nexus\pom.xml to C:\Softwares\Developer_Kits\apache-maven-3.8.8\repository\cn\myphoenix\maven_nexus\1.0-SNAPSHOT\maven_nexus-1.0-SNAPSHOT.pom
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ maven_nexus ---
Downloading from myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven-metadata.xml
Uploading to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven_nexus-1.0-20241128.071034-1.jar
Uploaded to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven_nexus-1.0-20241128.071034-1.jar (2.5 kB at 16 kB/s)
Uploading to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven_nexus-1.0-20241128.071034-1.pom
Uploaded to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven_nexus-1.0-20241128.071034-1.pom (1.2 kB at 8.2 kB/s)
Downloading from myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/maven-metadata.xml
Uploading to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven-metadata.xml
Uploaded to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/1.0-SNAPSHOT/maven-metadata.xml (767 B at 7.8 kB/s)
Uploading to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/maven-metadata.xml
Uploaded to myphoenix-nexus: http://localhost:8081/repository/myphoenix-snapshot/cn/myphoenix/maven_nexus/maven-metadata.xml (281 B at 3.8 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.498 s
[INFO] Finished at: 2024-11-28T15:10:38+08:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
查看私服上的内侧仓库 myphoenix-snapshot,发现部署成功:
将 pom.xml 文件中的 version 修改为 1.0.0,以相同的方式将其部署到私服的发布仓库 myphoenix-release 中。
在 maven_nexus_download 模块中,编写测试类,尝试引入发布版本的 maven_nexus-1.0.0.jar。
测试类:
public class CommonTest {
public void testSayHi() {
Common common = new Common();
common.sayHi();
}
}
测试通过: