简介Nexus Repository Manager 3.50.0-01官方Windows 64位安装包面向需要搭建私服仓库的Java开发与运维人员可解决Maven、npm、Docker等构建产物的统一存储、版本管理与安全分发问题。资源包共690个文件以419个jar核心库、82个dll运行组件、22个exe可执行程序为主辅以xml配置、properties环境参数、cfg启动项及png图标等整体大小240.15MB解压即可用于搭建Maven私服。已有494人学习下载。实际部署后可获得完整的Nexus服务目录结构、JMX远程管理配置、安全证书文件及跨平台启动脚本同时提供细粒度权限控制相关配置便于快速完成仓库初始化、权限管理和构建产物发布。适合正在搭建企业内部依赖管理平台的中高级开发者参考。1. Nexus 3.50.0 是什么一个 win64.zip 解决了三件私服的事第一次拿到nexus-3.50.0-01-win64.zip时多数人以为它只是个解压即用的软件包实际它是 Nexus Repository Manager 3.50.0 的 Windows 64 位发行版承担了内部构件仓库里最琐碎的三件事代理外网仓库、托管团队内部制品、把多个仓库聚合成一个统一入口。对 Windows 服务器上跑构建的后端或运维工程师来说它是替代手工搬 jar、解决依赖下载慢、统一构建产物版本的一类基础设施。适合两类人一类是刚接触私有仓库、想让 Maven 或 npm 构建不再依赖公网稳定性的人另一类是已经有一堆散落制品、想用一套工具收口并做权限管理的人。下文按“部署 → 初始化 → 建仓 → 排错 → 备份”的顺序拆解所有命令基于 Windows Server 2016 以上环境实测可用路径按你实际解压位置替换。2. Windows 解压部署目录布局、JVM 参数与五个命令验证2.1 解压后的目录bin、etc、lib 和 sonatype-work 各管什么解压nexus-3.50.0-01-win64.zip后根目录下会出现两个主要层级安装目录本身以及在它旁边的sonatype-work数据目录首次启动后自动生成。安装目录里最需要关心的四个区域如下目录/文件作用常动还是常看bin\nexus.exeWindows 服务包装器负责启动、停止、安装为服务常动bin\nexus.vmoptionsJVM 堆、直接内存、GC 参数的配置文件常动etc\nexus-default.propertiesHTTP 端口、Host 绑定、上下文路径等基础配置偶尔动sonatype-work\nexus3真正存数据的地方数据库、blob、密钥、日志常看我第一次部署时习惯性去翻lib以为核心逻辑都在里面后来发现lib只是在启动时被类加载器读取日常运维根本不需要碰。真正影响你磁盘占用和备份策略的是sonatype-work它才是整个 Nexus 的“黑匣子”所有仓库配置、缓存制品、账号信息都落在这里。如果只复制安装目录去迁移等于只搬了个空壳。2.2 改 JVM 参数nexus.vmoptions 里堆内存与直接内存的取舍启动前先看一眼bin\nexus.vmoptions这是 Nexus 唯一在部署阶段就必须调整的文件。默认配置在低配机器上能用但仓库一多、并发上传一上来就各种卡。我的基准做法是先给到 2G 起步生产按制品量再往上加-Xms1024m -Xmx1024m -XX:MaxDirectMemorySize1024m -XX:UnlockDiagnosticVMOptions -XX:LogVMAuditEvents -Dkaraf.home.这里有个容易理解偏的点-Xms和-Xmx管的是 JVM 堆而 Nexus 在下载大文件、做哈希计算时会大量使用直接内存对应-XX:MaxDirectMemorySize。如果你只调大-Xmx直接内存不够照样报OutOfMemoryError。反过来也别把三项都设成物理内存的一半因为 Windows 的文件缓存还要占内存给太多反而让整机 swap表现就是 Nexus 进程内存不高但服务器响应迟钝。实际项目中我一般让-Xmx和MaxDirectMemorySize保持相同值预留至少 2G 给系统。2.3 启动、等待与端口验证五分钟确认服务真正活起来修改完 vmoptions以管理员身份打开 PowerShell进入 bin 目录。第一次建议前台运行方便直接看滚动日志cd /d C:\tools\nexus-3.50.0-01\bin nexus.exe /run前台看到类似Started Nexus的输出说明服务已经起来了。确认没问题后再装成 Windows 服务避免关掉终端服务就停nexus.exe /install net start nexus服务启动后验证要分成两步。第一步看端口监听第二步看 HTTP 状态接口。注意在 PowerShell 里别直接用curl它默认是 Invoke-WebRequest 的别名结果格式完全不同要显式用curl.exenetstat -ano | findstr 8081 curl.exe -s -o NUL -w %{http_code} http://localhost:8081/service/rest/v1/status返回200说明管理接口正常返回000或连接失败去sonatype-work\nexus3\log\nexus.log里看最底部几行异常堆栈。第一次启动耗时可能在一到三分钟日志长时间停在某个初始化阶段是正常的不要反复重启不然容易把 H2 数据库写坏。3. 首次初始化admin 口令文件、默认仓库与匿名访问的设置顺序3.1 admin.password 文件第一次登录前必读的临时口令Nexus 首次启动完成后浏览器访问http://localhost:8081会看到登录页。默认管理员账号是admin但密码不是常见的admin123而是写在数据目录里的一个临时文件中。文件路径是C:\tools\nexus-3.50.0-01\sonatype-work\nexus3\admin.password用 PowerShell 直接读取type C:\tools\nexus-3.50.0-01\sonatype-work\nexus3\admin.password把输出内容复制到登录框首次登录会强制要求改密码。修改成功后Nexus 会自动删除这个临时文件。这是个很关键的判断点如果哪天你发现这个文件还在说明初始化过程没走完或者是系统根本没有成功写入密钥文件如果文件没了但你还没登录过说明管理员密码已经被别人抢先改掉需要尽快检查网络边界和账号列表。提示如果服务器上同时跑着多个 Java 进程注意核对端口是否是 8081避免把另一个服务的登录页当成 Nexus。3.2 默认仓库检查maven-central、maven-public 各自承担什么登录后进入 Settings → Repository → Repositories3.50.0 首次初始化会自带一组 Maven 相关仓库。它们不是装饰直接决定你客户端怎么配仓库名类型作用maven-centralproxy代理中央仓库制品首次拉取后缓存在本地maven-releaseshosted正式版本构件上传入口默认不允许覆盖maven-snapshotshosted快照版本构件上传入口可重复部署maven-publicgroup聚合上面三个仓库客户端只认它很多新人上来就自己创建仓库结果发现 Maven 构建还是访问外网原因就是 maven-public 这个 group 没有把新仓库加进去。maven-public是默认客户端入口你要自建的 hosted 或 proxy 必须挂到它下面否则客户端永远不会走新仓库。这一步在界面上的操作是编辑maven-public→ Members → 把新仓库按顺序加入并保存。3.3 匿名访问开关先关掉再配仓库不然被别人白嫖带宽Nexus 3 默认允许匿名用户访问服务器意思是只要知道地址不需要账号就能读取 group 里的制品。内网环境图省事可以开着但服务器暴露到办公网或云上就建议马上关。菜单位置在 Settings → Security → Anonymous Access把Allow anonymous users to access the server取消勾选。关掉后用下面的命令验证是否生效curl.exe -s -o NUL -w %{http_code} http://localhost:8081/repository/maven-public/关闭前返回200关闭后应该返回401。如果返回404说明仓库路径名不对先检查仓库列表里的真实名字别急着怀疑匿名配置。4. 仓库实战proxy 代理、hosted 托管、group 聚合三个角色怎么搭4.1 proxy 代理仓库拉中央仓库并缓存配置 mirror 的先后顺序代理仓库是私服里最先要配的。以 Maven 为例创建一个新的 proxySettings → Repository → Repositories → Create repository → 选maven2 (proxy)。名称填maven-central-proxy远程仓库地址填中央仓库的地址其他用默认。界面里有一个Auto-blocking选项建议开着中央仓库长时间连不上时 Nexus 会自动把该代理仓库标记为离线避免每次都去外层网络撞一遍超时。创建完代理仓库客户端侧要让 Maven 知道“所有依赖都走私服”。在 Maven 的settings.xml里加 mirror 配置settings mirrors mirror idnexus-group/id mirrorOf*/mirrorOf urlhttp://localhost:8081/repository/maven-public//url /mirror /mirrors /settingsmirrorOf的取值要解释清楚*表示所有仓库请求都镜像到 Nexusexternal:*表示只镜像外网仓库而保留本地file://仓库后者在混合场景更安全。我一般不用通配*因为团队有人配置本地私有 SNAPSHOT 仓库时会被强制路由到 Nexus排查依赖来源时容易混淆。配置完执行一次mvn clean install -U观察日志里下载地址是否变成localhost:8081再对比 Nexus 控制台对应 proxy 仓库的“浏览”标签页里是否出现缓存的 jar。4.2 hosted 托管仓库release 与 snapshot 的区别和部署规则proxy 解决的是“下载”hosted 解决的是“上传”。Maven 项目里正式版本和快照版本要分开存否则mvn deploy会因版本策略报错。创建时选maven2 (hosted)Version policy有三个选项Release只允许非 SNAPSHOT 版本发布Snapshot只允许 SNAPSHOTMixed两者都允许。我建议 release 和 snapshot 分开两个 hosted配Release的那个开启Disable redeploy防止正式版本被覆盖这对追溯线上构建产物非常关键。部署侧要在项目的pom.xml里加 distributionManagementdistributionManagement repository idnexus-releases/id urlhttp://localhost:8081/repository/maven-releases//url /repository snapshotRepository idnexus-snapshots/id urlhttp://localhost:8081/repository/maven-snapshots//url /snapshotRepository /distributionManagement同时settings.xml里要提供对应 id 的账号servers server idnexus-releases/id usernamedeploy/username password部署账号密码/password /server server idnexus-snapshots/id usernamedeploy/username password部署账号密码/password /server /servers这里最容易翻车的是 id 不匹配pom 里 repository 的 id 是给 Maven 找凭据用的它必须和 settings.xml 里 server 的 id 完全一致而不是和 Nexus 仓库名一致。我之前见过有人把id写成maven-releases结果 deploy 时一直 401因为 Maven 根本拿不到对应凭据。4.3 group 聚合仓库客户端只填一个 URL 的合并逻辑group 仓库不存制品只做路由。它按成员顺序遍历内部仓库找到第一个匹配的制品就返回。创建方式Create repository →maven2 (group)然后把刚才的 proxy 和 hosted 加进 Members。成员顺序很有讲究hosted 放前面、proxy 放后面。理由很简单——如果你把 proxy 放前面本地已经发布的正式版本在 proxy 里如果存在同名同版本旧缓存group 会把旧缓存返回给客户端等到你发现线上跑的构件和仓库里的不一致通常已经过去了大半天。配置好 group 后客户端不需要同时配置多个仓库 URL只需要把settings.xml里 mirror 的 URL 指到 group 地址http://localhost:8081/repository/maven-public/。这个地址一次请求就能依次检查 releases、snapshots、central 代理缓存解析顺序由 Members 列表决定。调试时可以用浏览器直接打开 group 仓库地址逐步访问/repository/maven-public/下的目录层级确认某个构件实际是从哪个成员仓库命中的。5. 常见问题排查端口占用、内存溢出、反代跳转三组现场记录5.1 端口 8081 被占用启动到一半卡死的处理路径现象执行nexus.exe /run后日志刷到Application Server相关行就停住一直不出现启动完成的提示浏览器访问http://localhost:8081超时或直接显示“无法访问此网站”。原因8081 端口被其他进程占用。最常见的是另一个 Java 服务、HTTP 调试工具或者上一次 Nexus 没完全退出残留的进程。解决先用命令确认占用者身份再决定动谁netstat -ano | findstr 8081 tasklist | findstr 1234第二行的1234换成第一行输出的 PID。如果是残留的 nexus 进程用taskkill /PID 1234 /F结束如果是无关服务去etc\nexus-default.properties里把application-port改成 8082然后重启服务。改端口这个操作本身不复杂但记得检查防火墙是否对 8082 放行否则服务起来了内部网络也访问不到。5.2 直接内存溢出日志里的 OutOfMemoryError 与两处补救现象仓库运行一段时间后上传大文件或代理仓库同步大目录时接口返回 500nexus.log里出现Direct buffer memory或OutOfMemoryError重启后短期内又复发。原因默认的-XX:MaxDirectMemorySize太小。Nexus 在计算 SHA-1 哈希、做 blob 写入时大量使用堆外直接内存这部分不受-Xmx控制。只调大堆内存等于没调。解决改bin\nexus.vmoptions把直接内存和堆同步放大。比如 4G 内存的机器可以这样给-Xms2g -Xmx2g -XX:MaxDirectMemorySize2g改完必须重启服务因为 vmoptions 只在 JVM 启动时读取。如果改完仍然溢出还要检查一下是不是磁盘 IO 太慢导致缓冲区积压观察sonatype-work\nexus3\log\nexus.log里有没有大量Read timed out有的话优先升级磁盘性能而不是继续加大内存。5.3 反代之后登录跳 localhostHost 头和 Base URL 都要管现象通过公司域名https://repo.company.local访问 Nexus登录输完账号密码后页面 URL 被重定向到http://localhost:8081浏览器直接打不开或者证书报错。原因Nexus 没有感知外部访问地址。它收到的是反代转发过来的请求但反代没把原始 Host 头传过去Nexus 按自己的监听地址生成了重定向 URL。解决两个方面同时改。第一在 Nexus 的 Settings → HTTP/HTTPS → Server 里把 Base URL 填成对外域名https://repo.company.local第二在反代层保证以下请求头被正确透传以常见反代配置为例proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;Host让 Nexus 知道用户当初访问的是哪个域名X-Forwarded-Proto告诉它外部走的是 HTTPS这样重定向和生成的下载链接才会用 https 前缀。改完清掉浏览器缓存再试因为浏览器也会缓存 301 重定向旧跳转记录会干扰验证。5.4 还有两个容易忽略的点磁盘空间和系统时间现象上传一个不大的 jar 包失败日志报java.io.IOException: No space left on device但 Windows 里看 C 盘剩余空间还有好几个 G。原因Nexus 的 blob 存储不是一个一个 jar 文件而是分块写入的文件块块会预分配空间另外 temp 目录或者系统 pagefile 所在分区满了也会报同样错误。解决确认sonatype-work所在磁盘的真实剩余空间可用fsutil volume diskfree C:看精确字节数。长期运行的实例建议把 blob 存储的默认目录放到独立数据盘不要和系统盘共用。另一个隐藏坑是系统时间偏差过大会导致使用 HTTPS 的 proxy 仓库在 TLS 握手时报证书有效期错误数据库内部的一些时间戳判断也会异常。Windows 服务器上要保证 NTP 同步偏差超过五分钟就要警惕。6. 只追这一件事目录级备份与迁移怎么验证Nexus 的备份不是点个导出按钮就完事它没有标准的内置全量导出功能可靠做法是直接备份整个数据目录。备份范围就一句话sonatype-work\nexus3下除tmp外的全部内容整体复制。三个核心子目录一个都不能少子目录内容缺失后果dbH2 数据库存仓库、账号、权限等元数据仓库列表全空所有配置丢失blobs真实制品内容构件全部失效别人拉不到包keystore加密密钥文件敏感数据无法解密账号密码体系损坏我用 robocopy 做镜像备份它比Copy-Item稳支持多线程和断点续传robocopy C:\tools\nexus-3.50.0-01\sonatype-work D:\backup\nexus-work /MIR /MT /R:2 /W:5参数说明/MIR镜像目录保证备份与源完全一致/MT多线程拷贝大目录速度提升明显/R:2和/W:5限制重试次数与等待秒数避免文件占用时无限卡住。备份前最好先执行net stop nexus停服虽然在线拷也能用但数据库文件在写入中备份会留下不一致状态。恢复时按相反方向跑一次 robocopy然后启动服务。恢复完成后的验证比备份本身更重要这一步能筛掉九成备份不完整的问题robocopy D:\backup\nexus-work C:\tools\nexus-3.50.0-01\sonatype-work /MIR /MT /R:2 /W:5 net start nexus curl.exe -s -o NUL -w %{http_code} http://localhost:8081/service/rest/v1/status再抽查一个具体制品的哈希是否与备份前一致。以 jar 为例Get-FileHash C:\tools\nexus-3.50.0-01\sonatype-work\nexus3\blobs\default\...\your-file.jar哈希一致说明 blob 文件完整可读库表与文件块对得上。迁移到新服务器时最稳妥的做法是保持安装路径一致因为某些 blob 配置里记录了相对路径依赖如果路径必须变迁移后要在界面里确认每个 blob store 的 status 不是failed然后重新索引一下仓库。有一回我图省事只拷了 blobs 目录结果恢复后仓库列表全空db 没备份等于白干。从那以后我每次升级或迁移 Nexus都强制走一遍“停服 → robocopy 全量数据目录 → 启动 → 校验哈希”的完整链路不跳过任何一步。希望帮到你。本文还有配套的精品资源点击获取