Sonatype 是一个强大的仓库管理系统,专注于构建和管理软件组件。作为开源的 Repository Manager,它支持 Maven、npm、Docker 等多种仓库类型,提供稳定的依赖管理和构建工具,加速软件开发过程。Sonatype Nexus3 不仅能够帮助团队更有效地管理依赖关系,还提供了安全性和可扩展性,成为现代化软件开发的重要基础设施组件。早期我们只把它当作 Maven 私服,现在已经支持各种类型的包,比如:Npm、Ruby、Docker 等
我们使用 Docker 安装并部署 Nexus3 私服,采用官方推荐的稳定镜像。
创建 docker-compose.yml 配置文件,内容如下:
services:
nexus3:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 8081:8081
volumes:
- ./data:/nexus-data启动容器时可能会报错,通过 docker logs -f nexus3 查看日志,可知是数据目录无权限导致:
root@ubuntu:/usr/local/docker/nexus3# docker logs -f nexus3
# 创建目录时,报没有权限的错误
mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
Warning: Cannot open log file: ../sonatype-work/nexus3/log/jvm.log
Warning: Forcing option -XX:LogFile=/tmp/jvm.log
OpenJDK 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory
java.io.FileNotFoundException: ../sonatype-work/nexus3/tmp/i4j_ZTDnGON8hezynsMX2ZCYAVDtQog=.lock (No such file or directory)
at java.io.RandomAccessFile.open0(Native Method)
at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
at com.install4j.runtime.launcher.util.SingleInstance.check(SingleInstance.java:72)
at com.install4j.runtime.launcher.util.SingleInstance.checkForCurrentLauncher(SingleInstance.java:31)
at com.install4j.runtime.launcher.UnixLauncher.checkSingleInstance(UnixLauncher.java:88)
at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:67)
java.io.FileNotFoundException: /nexus-data/karaf.pid (Permission denied)官方推荐解决方案:Nexus 容器内运行用户的 UID 为 200,执行以下命令授权数据目录,再重启容器即可:
# 授权数据目录
chown -R 200:200 ./data
# 重启容器
docker-compose up -d服务启动成功后,通过浏览器访问 控制台:
访问地址:http://服务器 IP:8081/


默认管理员账号为 admin,初始密码存储在容器内,通过以下命令获取:
查看管理员初始密码
docker exec -it nexus3 cat /nexus-data/admin.password
# 示例输出
905fc654-3c83-4421-9f5b-9710a5a33561使用 admin + 初始密码登录控制台,系统会自动弹框引导修改密码;也可后续在用户管理菜单中修改。


导航至 Repository > Blob Stores 配置对象存储,用于管理仓库的物理存储位置。

注意:请按实际业务场景设置存储大小限制,避免磁盘空间被占满。

导航至 Repository > Cleanup Policies 配置存储清理策略,自动清理无用组件。

示例:配置 30 天自动清理一次 Maven 快照版本包。

也可以在 System > Tasks 里创建定时任务,执行快照清理操作。

示例配置:每天 01:00 自动清理 Maven 快照包。

导航至 Repository > Repositories 配置仓库,Nexus3 提供三种核心仓库类型:
Proxy:代理仓库,对外部公共仓库的代理,只读且支持缓存依赖包
Hosted:托管仓库,私有仓库,支持上传自定义组件包
Group:仓库组,整合多个 Proxy/Hosted 仓库,对外提供统一访问地址,只读

新建代理仓库,配置阿里云公共 Maven 仓库地址,加速依赖下载:
阿里云仓库地址:https://maven.aliyun.com/nexus/content/groups/public/



将新建的阿里云代理仓库,添加到默认的 maven-public 分组中,开发仅需使用该分组地址即可。

按照私有仓库 → 快照仓库 → 代理仓库的顺序排列,定义依赖查找优先级:

最终使用的私服地址:http://服务器 IP:8081/repository/maven-public/
修改 Maven 的 settings.xml 配置文件,对接 私服。
在 servers 标签中配置私服认证信息(禁用匿名访问时必填):
<server>
<id>maven-public</id>
<username>admin</username>
<password>你的修改后密码</password>
</server>
<!-- 上传发布包使用 -->
<server>
<id>maven-release</id>
<username>admin</username>
<password>你的修改后密码</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>你的修改后密码</password>
</server>在 mirrors 标签中配置私服镜像,id 必须与 servers 中保持一致:
<mirror>
<id>maven-public</id>
<mirrorOf>central</mirrorOf>
<name>Maven public</name>
<url>http://192.168.60.134:8081/repository/maven-public/</url>
</mirror>在 IDEA 中,将 Maven 配置指定为本地修改后的配置文件,关联 Nexus3 私服。

执行 mvn clean install 命令,Maven 会从私服下载依赖,同时私服会自动缓存公共依赖包。

缓存完成后,可在控制台查看已缓存的依赖包。

修改项目 pom.xml,配置上传地址,将自定义 Jar 包部署到私服:
<distributionManagement>
<repository>
<!-- id 与 settings.xml 中的 server 对应,完成授权上传 -->
<id>maven-release</id>
<name>Nexus3 Release</name>
<url>http://192.168.60.134:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>maven-snapshots</id>
<name>Nexus3 Snapshots</name>
<url>http://192.168.60.134:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>上传成功后,登录私服即可查看自定义 Jar 包,团队可通过坐标直接引用,实现协同开发。
