前言
事情是这样的,最近接手一个比较复杂的 Java 项目。这个项目的单元测试的数据是一个单独的 Web 服务。此服务的调用方式是 Feign + 微服务。接手的第一步就是需要补充单元测试,于是就一边写项目的单元测试,一边完善单测服务。
此时就遇到需要将单测服务的工具包更新并上传到公司的私服上。 emm 整个操作逻辑大致比较清楚,但是实操还是第一次。今天就看看如何发布 Jar 包到私服。
技术背景
- Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
- Nexus 是一个强大的仓库管理器,可以极大地简化了内部仓库的维护和外部仓库的访问。
下图为 Nexus 对应的功能,图片来自官网:
项目实践
1. 安装 Nexus
如果公司有自己的 Nexus,可以直接跳过这一步。
我推荐使用 Docker 安装,方便、省事、快捷、跨平台。
# 这里只做演示就没有指定共享目录,如果是正常情况下需要指定文件夹目录做数据的持久化
docker run -d -p 8081:8081 --name nexus3 --restart=always sonatype/nexus3
启动完成浏览器访问 http://localhost:8081 ,完成初始化后就可以进行后续的操作了。
注意事项:
- 如果
http://localhost:8081/404,试着访问http://localhost:8081/nexus - nexus 初始化密码需要进入 docker 容器中获取
docker exec nexus3 cat /nexus-data/admin.password
2. 配置 仓库
- 2.1 为了方便管理新建
Blob Stores
- 2.2 新建
Repositories maven2(hosted)注意下图中的参数
- 2.3 新建
Repositories maven2(proxy)注意下图中的参数
# 阿里云的maven中央仓库地址
http://maven.aliyun.com/nexus/content/groups/public/
- 2.4 新建
Repositories maven2(group)注意下图中的参数
- 2.5 查看结果并复制对应的地址
3. 环境配置
- 3.1 配置
.m2/settings.xml, 此处的地址源于上一步的仓库地址。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<name>nexus respository</name>
<url>http://deepin:8081/repository/test_group/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
- 3.2 配置本地项目
pom.xml,此处的地址与上一步地址保持一致。
<!-- ...... -->
nexus
nexus repository
http://deepin:8081/repository/test_hosted/
</repository>
<snapshotRepository>
<id>nexus</id>
<name>nexus repository</name>
<url>http://deepin:8081/repository/test_hosted/</url>
</snapshotRepository>
```
```
4. 上传 Jar 包
# 本地 maven 的版本信息
$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/Cellar/maven/3.6.3_1/libexec
Java version: 14.0.1, vendor: N/A, runtime: /usr/local/Cellar/openjdk/14.0.1/libexec/openjdk.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
- 方法一:Idea 中直接点击
- 方法二:命令行
# 在项目的目录下执行
mvn deploy
查看运行结果:
5. 解决上传错误问题
-
Return code is: 401一般是账号密码问题,需要核验账号密码是否配置正确,同时需要注意pom.xml与settings.xml的配置。 -
Return code is: 400nexus 的 repository 分三种类型:Hosted、Proxy、Group;部署的时候只能部署到 Hosted 类型的仓库中;需要检查所配置的仓库类型。 -
Return code is: 405一般是发布地址有问题,检查发布地址。
这里用到 Group 将 Hosted、Proxy 打包到一起使用,一个用于管理上传的 Jar 包,一个用于管理 代理的 Jar包。
下图为上传后的 Jar 包:
下图为代理后下载的 Jar 包:
6. 其他
因为 Nexus 支持多种仓库的设置,后续可以建立自己的 Docker、Pypi、Npm 仓库,有兴趣的小伙伴可以自行研究。