一、前言

有此次升级是因为12月初的时候CVE发布了一个关于apache.tika的漏洞(Apache tika-core XML外部实体注入漏洞(CVE-2025-66516)

公司安全部门提示需要升级至最新版tika,其中就包括了我们项目的私服。本来我关注的重点在项目测试、uat和生产环境上,私服中只是把tika相关的1.28.4版本删除了,但是漏洞还是存在,这让我思考:会不会是私服本身就有问题。

我去github上看了nexus-3.70.1-02的源代码,发现确实使用了tika包,而最新发布的3.87版本已经移除了,故有了本次升级。

在这里插入图片描述

二、过程

1、下载解压

我的包 nexus-3.87.1-01-linux-x86_64.tar.gz 是同事下好后丢给我的,网上相关教程很多,大家自行搜索即可。

拿到包后解压

tar -xzvf nexus-3.87.1-01-linux-x86_64.tar.gz

2、backup任务创建及sonatype-work备份

因为在3.71.x版本以后nexus不再支持OrientDB,所以从低版本升级之后需要做数据库迁移,官方支持内置的H2和外部的PostgreSQL。这里因为项目体量小,所以选择内置的H2。

在旧版本的nexus上,我们需要创建backup任务
在这里插入图片描述
右上角搜索backup,选择这个结果
在这里插入图片描述
location是bak文件存放的位置,记得提前建好目录,填好后create task
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刷新后出现OK字样,即为成功
在这里插入图片描述
此时在nexus-backup文件夹中有至少如下三个bak文件

component-<timestamp>.bak
config-<timestamp>.bak 
security-<timestamp>.bak

备份完成后进入对应nexus/bin文件夹停止旧版本nexus服务

./nexus stop

备份sonatype-work并删除原文件(其实就是改个名),启动新nexus用新生成的sonatype-work就行。这步的目的是让新版本nexus生成新的sonatype-work

mv sonatype-work sonatype-work-bak

3、下载jar包进行数据库迁移(迁移后启动失败,暂未解决)

使用对应版本的迁移包,链接在这,大家下载自己旧版本对应的nexus-db-migrator-*.jar包,不要下错版本了

将jar包上传到nexus-backup文件夹下,执行下面代码

java -Xmx16G -Xms16G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator-3.70.4-02.jar --migration_type=h2 --yes

执行成功后会得到一个nexus.mv.db

这个时候不着急,先回到我们第一步下载的nexus-3.87.1来

修改nexus配置,路径如下:

vim /app/nexus-3.87.1-01/etc/nexus-default.properties

只需要改端口号就行,这里我使用的8886
然后进入bin目录

cd /app/nexus-3.87.1-01/bin/

启动nexus

./nexus start

因为此时没有sonatype-work,没有日志文件,我们可以使用

./nexus start-launchd

携带日志启动,但是ctrl+c退出后就私服也停止了。但是也可以用,因为后面还会重启

稍等片刻后可以用./nexus status 确认状态,也可以lsof -i:8886查询端口状态,还可以ps aux | grep nexus。一切就绪后直接访问管理页面

IP:port(我的就是10.7.130.47:8886)

初次登录,用户名默认admin,密码会在页面上给你路径,我们直接复制路径去查看一下(下面是我的路径)

cat /app/sonatype-work/nexus3/admin.password

登录成功后我们来导入刚刚备份的数据,将nexus.mv.db复制到sonatype-work/nexus3/db

cp /app/nexus-backup/nexus.mv.db /app/sonatype-work/nexus3/db/

修改配置,同步我们nexus-default.properties的修改

vim /app/sonatype-work/nexus3/etc/nexus.properties

在最后一行加上

nexus.datastore.enabled=true

在这里插入图片描述

回到bin目录下重启私服(如果用的携带日志启动,ctrl+c后start就行)

/app/nexus-3.87.1-01/bin/
./nexus restart

此时可以查看启动日志了,新开一个服务器窗口,执行代码如下:

cd /app/sonatype-work/nexus3/log/
tail -500f nexus.log

到这步为止,迁移就完成了。但是,我在启动的时候报错了:

ERROR *SYSTEM org.flywaydb.core.internal.command.DbMigrate - Migration
of schema “PUBLIC” to version “2.50 -
ComponentTableIndexesMigrationStep_2_50” failed! Please restore
backups and roll back database and code! ERROR *SYSTEM
org.sonatype.nexus.upgrade.datastore.internal.UpgradeServiceImpl -
Failed transition: NEW -> STARTED
org.sonatype.nexus.upgrade.datastore.UpgradeException: SQL State :
42S22 Error Code : 42122 Message : Column “NORMALIZED_VERSION” not
found; SQL statement: CREATE INDEX IF NOT EXISTS
idx_apt_normalized_version ON apt_component (normalized_version)
[42122-232]

我怀疑是跟我jdk8的版本有关。
简单搜了一下,看到有的解决方案是下个H2后修改元数据,我感觉太麻烦了,所以决定上传我的maven本地仓库。各位如果有好的解决方案欢迎评论讨论,一起学习

4、使用脚本导入maven repo文件夹

该部分脚本参考文献为文末的第三个链接,这里我便不再赘述。有一点需要说明,就是第一步创建远程仓库的时候要根据自己项目来,比如我的项目pom中用的maven-releases库,那我就不用新建了。另外库的type一定要hosted。

5、弃用内置jdk,选用openjdk(公司要求)

经过漫长等待,终于上传完毕。这时候想起来公司要求必须使用开源jdk,我服务器上是jdk8,那要求jdk21的新版nexus肯定是用的内置jdk了,我需要替换一下路径

ps aux | grep nexus

找到了路径位置为

/app/nexus-3.87.1-01/jdk/temurin_21.0.9_10_linux_x86_64/jdk-21.0.9+10

在/app/nexus-3.87.1-01/jdk/路径下新建文件夹

mkdir openjdk

将开源的jdk21丢进去
修改配置文件

vim /app/nexus-3.87.1-01/bin/nexus

修改EMBEDDED_JDK的路径如下:
在这里插入图片描述

restart一下,再执行ps aux | grep nexus确认一下
在这里插入图片描述

大功告成

三、结语

在这次升级之前我基本没了解过nexus,基本每走一步都在报错,整个过程中确实学到了到很多新知识。果然只有实践才会更快地成长,继续学习,持续记录,诸君共勉

四、参考文献

1、https://help.sonatype.com/en/migrating-to-a-new-database.html
2、https://regenm.github.io/2025/10/17/nexus%E5%8D%87%E7%BA%A7%E4%B8%8E%E8%BF%81%E7%A7%BB/
3、https://www.cnblogs.com/studyjobs/p/18906386

更多推荐