
简介Nexus 3.70.1-02 是 Sonatype 官方推出的 Windows 64 位仓库管理平台安装包面向需要在内网搭建私有 Maven、npm、Docker 等镜像源与制品仓库的 Java 开发、DevOps 及运维人员。压缩包共 758 个文件以 499 个 jar 核心依赖为主辅以 82 个 dll 本地库、22 个 exe 可执行程序、30 个 xml 配置、19 个 properties 与 13 个 cfg 参数文件另有少量 html、yml、sh 及证书相关文件整体约 284.34MB解压后即为完整可运行目录。内容涵盖 Karaf 容器配置、JMX 访问控制、证书信任库、字体与安全策略等模块便于直接部署并二次调整。目前已有 593 人学习下载适合希望替代公网仓库、统一管理依赖与加速构建的团队参考使用。1. 拿到 nexus-3.70.1-02-win64.zip 之后它到底是什么能解决哪些镜像源问题如果你在内网环境里待过就一定遇到过这种场景开发同事要拉一个 Maven 依赖外网访问不稳定构建一会儿成功一会儿失败运维同事想统一管理 npm、Docker、PyPI 的制品又不想每个工具都单独搭一套服务。这时候 nexus-3.70.1-02-win64.zip 就是那个被反复翻出来的东西——它是 Sonatype Nexus Repository Manager 3 的 Windows 64 位发行包解压后自带一套完整的仓库服务能同时代理和托管 Maven、npm、Docker、PyPI、NuGet 等多种格式的制品。这个包最直接的价值是把「nexus 镜像源 mirror」这件事从零散配置变成集中管理你只需要在一台 Windows 机器上把它跑起来后面所有构建工具都指向它外网抖动就跟你没关系了。它适合中小团队的自建制品库、离线环境的依赖中转也适合个人开发者想在自己机器上搭一个稳定的本地镜像源。下面我从解压后的目录结构开始把配置、启动、踩坑和验证一步步拆开。2. 解压后的目录结构与关键配置文件先看懂再动手2.1 为什么不能直接双击 exe 就完事nexus-3.70.1-02-win64.zip 解压后会有两个顶层目录nexus-3.70.1-02和sonatype-work。前者是程序本体后者是运行时数据、日志、仓库存储和配置的落盘位置。很多人第一次用解压完直接进bin目录双击nexus.exe结果要么闪退要么启动到一半报端口占用根本原因是没有先确认 Java 环境和目录权限。Nexus 3 依赖 JDK 8 或 JDK 113.70 版本对 JDK 17 的支持需要额外确认常见做法是先用 JDK 11 跑通而且sonatype-work目录需要有写权限否则启动时会卡在创建仓库索引的阶段。我一般会先把解压路径放在一个没有中文、没有空格的目录下比如D:\nexus然后检查JAVA_HOME是否指向一个可用的 JDK。2.2 几个必须认识的配置文件解压后etc目录下有一批配置文件名字看起来杂但真正影响启动和使用的就那么几个。下面这张表是我每次部署时都会过一遍的清单配置文件作用什么时候需要改nexus-default.properties端口、上下文路径、工作目录改默认 8081 端口或加 HTTPS 时nexus.vmoptionsJVM 堆内存、GC 参数仓库数量多、并发高时调大-Xmxjmxremote.accessJMX 远程访问权限需要监控 JVM 状态时jmx.acl.cfgJMX 访问控制列表配合 JMX 监控做权限限制org.apache.karaf.shell.cfgKaraf 控制台 SSH 端口默认 8022冲突时改org.apache.karaf.features.cfg功能模块加载一般不动排错时看org.ops4j.pax.url.mvn.cfg内部 Maven 仓库地址离线环境或代理仓库时改profile.cfg环境 profile多环境切换时用cacerts/blacklisted.certs证书信任库代理 HTTPS 仓库遇到证书问题时fontconfig.bfc字体配置缓存Windows 下一般不用管ASSEMBLY_EXCEPTION打包许可说明不用改这张表里新手最需要关注的是nexus-default.properties和nexus.vmoptions。前者决定服务能不能被访问到后者决定服务能不能扛住你的仓库规模。jmxremote.access和jmx.acl.cfg属于进阶监控配置一开始可以不动但要知道它们在哪后面接 Prometheus 或者 JConsole 的时候会用到。2.3 启动脚本与目录权限的实操在 Windows 上启动 Nexus常见做法是用bin目录下的nexus.exe配合/run参数或者直接安装成 Windows 服务。我一般先用前台方式跑一次确认没有报错再装服务。命令如下# 进入解压后的 bin 目录 cd D:\nexus\nexus-3.70.1-02\bin # 前台启动观察控制台输出 nexus.exe /run # 如果看到 Started Sonatype Nexus 字样说明启动成功 # 默认访问地址是 http://localhost:8081这段命令的逻辑是/run让 Nexus 在当前命令行窗口前台运行所有日志直接打印出来方便你第一时间看到端口冲突、Java 版本不匹配、目录权限不足等问题。参数说明上nexus.exe还支持/install、/start、/stop、/uninstall来管理 Windows 服务但第一次部署不建议直接装服务因为服务模式下日志分散排错成本高。等前台跑通之后再用nexus.exe /install注册成服务之后就可以用net start nexus来启动了。提示如果前台启动时报java.lang.UnsupportedClassVersionError说明 JDK 版本不对换 JDK 11 再试。如果报Address already in use说明 8081 或 8022 被占用去nexus-default.properties里改端口。3. 把 Nexus 配成镜像源Maven、npm、Docker 的代理与托管3.1 创建代理仓库的通用逻辑Nexus 的核心用法是「代理 聚合 托管」。代理仓库负责去外网拉取制品并缓存到本地聚合仓库把多个代理仓库合并成一个地址对外托管仓库放自己团队发布的内部包。以 Maven 为例登录http://localhost:8081后默认管理员账号是admin密码在sonatype-work/nexus3/admin.password文件里。第一次登录会强制改密码改完之后进Repository-Repositories-Create repository选择maven2 (proxy)然后填两个关键参数Name随便起比如maven-central-proxyRemote storage填https://repo1.maven.org/maven2/。保存之后这个代理仓库就可以被项目引用了。同样的逻辑适用于 npm创建npm (proxy)Remote storage填https://registry.npmjs.org/。Docker 稍微特殊需要创建docker (proxy)并配置一个独立的端口因为 Docker 协议不走 HTTP 路径。PyPI 则是pypi (proxy)Remote storage填https://pypi.org/。这些代理仓库创建后Nexus 会在第一次请求时去外网拉取之后缓存到本地后续请求直接命中缓存。3.2 Maven 项目如何指向 Nexus 镜像源代理仓库建好后需要在 Maven 的settings.xml里配置 mirror让所有中央仓库请求都走 Nexus。下面是一个最小可用的配置片段mirrors mirror !-- 这个 id 可以随便起但要和 server 里的 id 对应 -- idnexus-mirror/id !-- 指向 Nexus 的聚合仓库地址不是代理仓库地址 -- urlhttp://192.168.1.100:8081/repository/maven-public//url mirrorOfcentral/mirrorOf /mirror /mirrors这段配置的逻辑是mirrorOf写central表示拦截所有对 Maven 中央仓库的请求转发到 Nexus 的maven-public聚合仓库。maven-public是 Nexus 默认创建的一个 group 仓库里面已经包含了maven-central、maven-releases、maven-snapshots等成员。参数说明上url里的 IP 要换成你 Nexus 所在机器的实际 IP端口默认 8081路径/repository/maven-public/是固定格式。如果团队有内部发布的包还需要在settings.xml里加servers配置把发布账号密码写进去否则mvn deploy会报 401。3.3 npm 和 Docker 的镜像源配置差异npm 的配置比 Maven 简单直接在项目根目录或者全局执行# 把 npm 的 registry 指向 Nexus 的 npm 聚合仓库 npm config set registry http://192.168.1.100:8081/repository/npm-public/ # 验证是否生效 npm config get registry这段命令的逻辑是修改 npm 的全局配置让所有npm install都走 Nexus。参数说明上npm-public是 Nexus 默认创建的 npm group 仓库里面包含了npm-proxy和npm-hosted。如果公司内部有私有 npm 包发布时需要用npm publish --registry http://192.168.1.100:8081/repository/npm-hosted/指定托管仓库地址。Docker 的配置稍微绕一点因为 Docker 客户端默认走 HTTPS而 Nexus 的 Docker 仓库默认是 HTTP。常见做法是在 Docker 的daemon.json里加insecure-registries然后重启 Docker 服务{ insecure-registries: [192.168.1.100:8082] }这段配置的逻辑是告诉 Docker 客户端192.168.1.100:8082这个地址允许用 HTTP 访问。参数说明上8082是 Nexus 创建 Docker 代理仓库时分配的端口不是 8081。配置完之后docker pull的时候把镜像地址写成192.168.1.100:8082/library/nginx这样的格式Nexus 就会去 Docker Hub 拉取并缓存。注意Docker 代理仓库的端口不能和 Nexus 主端口冲突创建仓库时 Nexus 会让你指定一个 HTTP 端口我一般用 8082 或 8083。4. 避坑与排查Windows 下跑 Nexus 最常见的五个翻车点4.1 启动报端口占用但改了端口还是不行现象是前台启动时报Address already in use: bind你去nexus-default.properties里把application-port从 8081 改成 8089重启还是报同样的错。原因是 Nexus 除了主端口还有 Karaf 控制台的 SSH 端口 8022以及可能被其他服务占用的 8082、8083。解决方法是先用netstat -ano | findstr 8081找到占用进程确认是不是之前没关干净的 Nexus 进程然后一并检查 8022 和 Docker 仓库端口。我一般会在第一次部署时就把nexus-default.properties里的端口改成一组不常用的比如 18081同时把org.apache.karaf.shell.cfg里的 SSH 端口改成 18022。4.2 解压后直接运行提示找不到 sonatype-work现象是双击nexus.exe后窗口一闪而过或者命令行里报Cannot create directory sonatype-work。原因是sonatype-work目录默认创建在nexus-3.70.1-02的同级目录如果你把解压后的文件夹放在了C:\Program Files下面Windows 的权限控制会阻止写入。解决方法很简单把整个解压目录挪到D:\nexus这种没有权限限制的路径下或者手动创建sonatype-work目录并赋予当前用户完全控制权限。血泪经验是千万不要放在中文路径或带空格的路径下Karaf 在解析路径时对空格的处理不太稳定。4.3 代理 HTTPS 仓库时证书报错现象是创建了 Maven 代理仓库后第一次拉取依赖时日志里出现PKIX path building failed或unable to find valid certification path。原因是 Nexus 内置的cacerts信任库不包含某些企业内网 CA 或者自签名证书。解决方法是把目标仓库的证书导出用keytool导入到 Nexus 的cacerts里# 导出目标仓库的证书 openssl s_client -connect repo.example.com:443 -showcerts /dev/null 2/dev/null | openssl x509 -outform PEM repo.crt # 导入到 Nexus 的信任库默认密码是 changeit keytool -import -trustcacerts -alias repo-cert -file repo.crt -keystore D:\nexus\nexus-3.70.1-02\etc\cacerts\cacerts -storepass changeit这段命令的逻辑是先把远端仓库的证书下载下来再导入 Nexus 的信任库。参数说明上-alias是证书别名随便起但要唯一-keystore指向 Nexus 的cacerts文件-storepass默认是changeit如果你改过就填改后的。导入完成后重启 Nexus证书问题就解决了。4.4 内存不够导致仓库索引卡死现象是 Nexus 启动后能访问界面但创建代理仓库后一直卡在Remote storage的索引阶段日志里频繁出现OutOfMemoryError或者 GC 时间过长。原因是默认的nexus.vmoptions里-Xmx只有 1200m 左右仓库数量一多就不够用。解决方法是编辑nexus.vmoptions把-Xmx调到 4g 或 8g同时把-XX:MaxDirectMemorySize也相应调大# 编辑 nexus.vmoptions修改以下两行 -Xms4g -Xmx4g -XX:MaxDirectMemorySize4g参数说明上-Xms和-Xmx建议设成一样避免堆动态扩展带来的性能抖动MaxDirectMemorySize影响 NIO 的直接内存Docker 仓库和大量并发拉取时比较吃这个。改完重启 Nexus索引速度会明显改善。4.5 管理员密码文件找不到或已删除现象是第一次登录时不知道密码去sonatype-work/nexus3/admin.password找发现文件不存在。原因是 Nexus 在第一次启动时会生成这个文件但如果你之前启动过又删了sonatype-work目录或者用服务方式启动时工作目录不对文件就不会出现在你以为的位置。解决方法是先确认sonatype-work的实际路径可以在nexus-default.properties里看nexus-work配置项。如果确实找不到密码文件只能删掉整个sonatype-work目录重新初始化但这样会丢失所有已配置的仓库和缓存数据。所以我的习惯是第一次拿到密码后立刻改成一个自己管理的强密码并且把admin.password文件备份一份到安全位置。5. 验证镜像源是否生效三个可复现的检查动作5.1 用 Maven 拉一个不存在的依赖看日志配置完 mirror 之后最直接的验证方式是找一个本地没有缓存过的依赖执行mvn dependency:get然后观察 Nexus 的日志。如果日志里出现Downloading from nexus-mirror并且最终成功说明镜像源生效了。更严格一点可以把外网断开再执行一次同样的命令如果还能成功说明 Nexus 的缓存已经命中。我一般会用一个冷门但体积小的依赖来测比如org.apache.commons:commons-text:1.10.0这样不会因为依赖太大而等太久。5.2 检查 Nexus 的仓库浏览界面登录 Nexus 界面进Browse-maven-public看看里面有没有你刚刚拉取的依赖路径。如果有说明代理和缓存都正常。同时可以进Repository-Repositories点开对应的代理仓库看Remote storage的Last updated时间戳是不是刚刚。这个动作能帮你区分「请求走了 Nexus 但没缓存」和「请求根本没走 Nexus」两种情况。5.3 用 curl 直接打 Nexus 的 REST API对于喜欢命令行的同学可以直接用 curl 检查仓库状态# 检查 maven-public 仓库是否可访问 curl -u admin:yourpassword http://192.168.1.100:8081/service/rest/v1/repositories # 检查某个具体依赖是否已被缓存 curl -I http://192.168.1.100:8081/repository/maven-public/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar这段命令的逻辑是第一个请求列出所有仓库确认maven-public在列表里第二个请求用-I只看响应头如果返回200 OK并且Content-Length有值说明依赖已经被缓存到 Nexus。参数说明上-u后面跟管理员账号密码-I是 HEAD 请求不会下载整个文件。这两个命令组合起来可以在不依赖 Maven 的情况下快速判断 Nexus 是否正常工作。从那以后我每次部署完 Nexus都会强制走一遍「前台启动 - 改端口 - 建代理仓库 - 配 mirror - curl 验证」这五步确认每一步都有明确输出才交给团队用。希望帮到你。本文还有配套的精品资源点击获取