1 缘起
本来只打算测试jar包部署(deploy)到私仓,
可是,发现部署后与预期有些不一样,就又查了些资料,
实际验证了一下对应的功能,
比如,部署jar包区分快照版和发行版,
部署时需要使用不同的版本标识,快照版后缀:-SNAPSHOT,发行版后缀:-RELEASE或者纯版本号,
顺便学习了一下各个仓库的概念,见后文,
分享部署jar包到私仓以及如何引入私仓的jar包,
帮助开发者完善相关的私仓知识。
Ubuntu部署Nexus:https://blog.csdn.net/Xin_101/article/details/125906120
2 配置
使用Maven部署jar包到私仓,需要在项目中配置私仓地址,
并且,在本地的Maven中添加私仓的用户名和密码,
这里,需要注意:Maven配置文件的id和项目私仓地址的id保持一致,
部署jar包,区分快照地址和发行版地址,
引用jar包时使用私仓的公共仓库。
2.1 获取仓库地址
序号 | 仓库 | 地址 |
---|---|---|
1 | 快照仓库 | http://192.168.211.129:18081/repository/maven-snapshots/ |
2 | 发行仓库 | http://192.168.211.129:18081/repository/maven-releases/ |
获取仓库日志操作如下图所示:
-
快照版仓库:snapshots
-
发行版仓库:releases
2.2 配置项目中的pom.xml
添加属性:distributionManagement,即私仓(Nexus)地址
用于向私有仓库Nexus推送jar包,
其中,
- snapshotRepository:jar包快照版仓库,用于存储快照jar包
- id:自定义的id
- url:用于存储快照版jar包的私仓地址,如上
- repository:jar包发行版仓库
- id:自定义的id
- url:用于存储发行版jar包的私仓地址,如上
这里的id均为自定义的id,需要注意的是:
Maven的配置文件settings.xml中,
配置的servers属性id应与这里的id完全一致。
<distributionManagement>
<snapshotRepository>
<id>my-snapshots</id>
<name>My snapshots</name>
<url>http://192.168.211.129:18081/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>my-releases</id>
<name>My releases</name>
<url>http://192.168.211.129:18081/repository/maven-releases/</url>
</repository>
</distributionManagement>
上面介绍了快照版和发行版的仓库,
因此,使用deploy时,也会按照不同的版本将jar包部署到对应的仓库,
- 部署到快照版仓库:0.0.1-SNAPSHOT
快照版的版本后缀要添加-SNAPSHOT以区分是快照版,deploy时会将jar包发送到快照版仓库。 - 部署到发行版仓库:0.0.1-RELEASE
发行版的版本后缀添加-RELEASE,或者直接是数字,deploy时会自动部署到发行版仓库。
SNAPSHOT完整样例如下,版本为:0.0.1-SNAPSHOT,
如果是发行版,版本修改为:0.0.1-RELEASE,以示区分。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.monkey</groupId>
<artifactId>template-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>template-spring-boot-starter</name>
<description>Template project for Spring Boot Starter</description>
<properties>
<java.version>1.8</java.version>
<autoconfigure.version>2.4.5</autoconfigure.version>
<configuration.processor.version>2.4.5</configuration.processor.version>
</properties>
<dependencies>
<!-- Compile dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${autoconfigure.version}</version>
</dependency>
<!-- @ConfigurationProperties annotation processing (metadata for IDEs) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${configuration.processor.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
<distributionManagement>
<snapshotRepository>
<id>my-snapshots</id>
<name>My snapshots</name>
<url>http://192.168.211.129:18081/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>my-releases</id>
<name>My releases</name>
<url>http://192.168.211.129:18081/repository/maven-releases/</url>
</repository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3 配置Maven
在配置文件:maven目录/conf/settings.xml添加servers属性,
servers属性中这里可以配置多个私仓id,但需与上传项目pom.xml中配置的id一致,
用户名和密码即私仓Nexus的用户名和密码。
<servers>
<server>
<id>my-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>my-releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
3 部署
这里使用SpringBoot的starter项目作为测试。
3.1 部署到快照版仓库
将jar包部署到快照仓库,
pom.xml中的版本配置为0.0.1-SNAPSHOT,
标识为快照。
3.2 部署到发行版仓库
将jar包部署到发行版仓库,
pom.xml中的版本配置为0.0.1-RELEASE,
标识为发行版,也可以只用版本号,如0.0.1。
- 成功标识:
4 查看仓库
完成Nexus Repository私有仓库部署,登录私仓后,可以看到多个仓库,
仓库分类如下表所示,
序号 | 仓库 | 描述 |
---|---|---|
1 | maven-central | 中央仓库,默认从https://repo1.maven.org/maven2/拉取软件包,可配置 |
2 | maven-public | 公共仓库,存储发行版和快照版的软件包,即发行版和快照版的软件包都会在public中 |
3 | maven-releases | 发行版仓库,软件包稳定后,发布到该仓库,团队内使用 |
4 | maven-snapshots | 快照版本仓库,用于测试软件,发布到线上 |
4.1 快照版仓库
发布测试jar包到快照版,用于测试功能,即开发环境,
配置的快照版仓库提交策略为可覆盖,即同版本可重复提交,
使用时间戳区分不同的提交,后文:发行版和快照版有什么不同讲解。
-
进入快照版仓库
-
快照版jar包
-
如何删除?
4.2 发行版仓库
发行版仓库即生产环境,已完成测试的jar包,部署到发行版仓库,
供公司内部使用,部署时可以在版本号后添加后缀:-RELEASE作为标识,
当然也可以直接使用版本号,发行版仓库的jar并如下图所示。
4.3 公共仓库
公共版仓库中同时保存快照版和发行版jar包,
这个仓库用于开发者从私仓中拉取需要的jar包,后文讲解如何在项目中集成私仓,拉取jar包。
5 发行版和快照版有什么不同?
快照版使用时间戳作为版本后缀,
为什么呢?
因为快照版的提交策略为Allow redploy,允许相同版本号多次上传,
为了区分不同的版本,使用时间戳作为后缀。
快照版同一个版本的多次提交:
6 引入私仓jar包
引入私仓jar包,需要在项目中配置私仓的公共仓库地址,
以及对应包的Maven坐标。
6.1 获取jar包Maven坐标
首先从私仓的公共仓库maven-public中获取对用jar包的Maven坐标,
获取方式如下图所示。
6.2 项目配置私仓地址
在项目中添加私有仓库的地址,
通过repositories属性,与dependencies属性同级。
再引入对应的jar包Maven坐标,
配置样例如下:
<repositories>
<repository>
<id>my-public</id>
<url>http://192.168.211.129:18081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.monkey</groupId>
<artifactId>template-spring-boot-starter</artifactId>
<version>0.0.1-RELEASE</version>
</dependency>
</dependencies>
更新maven,依赖中出现对应的包:com.monkey:template-spring-boot-starter:0.0.1-RELEASE,
如下图所示。
7 Q&A
部署jar包无授权:401
status: 401 Unauthorized
- 原因
没有在Maven配置文件中(conf/settings.xml)中配置私仓的用户名和密码。 - 方案
在Maven配置文件中(conf/settings.xml)中配置私仓的用户名和密码,
其中,Maven配置文件的id与项目pom.xml的distributionManagement属性对应仓库的id一致。
<servers>
<server>
<id>my-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>my-releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
8 小结
核心:
(1)发布jar包有两种仓库选择:快照版和发行版;
(2)快照版多为测试阶段的版本,上传时添加-SNAPSHOT标识,自动将包上传到快照版仓库;
(3)发行版正式功能的版本,完成测试,上传时为区别于快照版本,添加-RELEASE后缀,如果只是版本数字号也可以;
(4)无论是上传到快照版仓库还是发行版仓库,公共仓库:maven-public都会保留这两者的jar包,供开发者选择;
(5)发行版和快照版的groupId和artifactId相同,唯一区别是版本号,其中,快照版的版本号使用时间戳作为后缀标识,因为快照版是测试阶段,选择覆盖策略的话,使用时间戳标识不同的测试版;
(6)项目引入私仓的jar包,需要在pom.xml中配置私仓地址(快捷的方式),然后引入对应的jar包即可。