JumpServer 的应用市场提供了 DBeaver 社区版的发布包,但版本停留在 22.3.4。本文记录如何将其升级到最新的 DBeaver 版本,并解决新版中
dbeaver-cli.exe被移除带来的兼容性问题。
1. JumpServer 远程应用 ZIP 包结构
JumpServer 的远程应用发布依赖一套约定的 ZIP 包格式。上传到应用市场后,JumpServer 服务端根据包内的声明文件,自动完成软件安装和连接启动两个阶段。
一个标准的 DBeaver 应用 ZIP 包含以下文件:
dbeaver/ ├── manifest.yml # 元数据:名称、版本、支持的协议 ├── setup.yml # 安装指令:下载源、静默安装参数、目标路径 ├── patch.yml # 补丁安装指令 ├── main.py # 入口点:接收连接参数,启动应用 ├── app.py # 核心逻辑:配置 DBeaver、拼接连接串、启动进程 ├── common.py # 工具库:base64 解码、数据模型、进程管理 ├── icon.png # 应用图标 ├── config/ │ └── drivers.xml # 数据库驱动模板 └── README.md关键文件是setup.yml(管安装)和app.py(管启动)。
2. 旧版的安装与启动流程
2.1 setup.yml — 自动下载安装
type:exesource:jms:///download/applets/dbeaver-ce-22.3.4-x86_64-setup.exearguments:-/S-/allusersdestination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver-cli.exemd5:EDA4440D4E32312DD25C9CE5289A228EJumpServer 服务端读取此文件后:
- 从内部文件服务器(
jms://协议)下载dbeaver-ce-22.3.4-x86_64-setup.exe - 在远程应用宿主机上静默执行:
dbeaver-ce-22.3.4-x86_64-setup.exe /S /allusers - 校验
md5,确认安装到C:\Program Files\DBeaver
2.2 app.py — 连接启动
_default_path=r'C:\Program Files\DBeaver\dbeaver-cli.exe'# ...exec_string='%s -con %s'%(self.path,params)ret=subprocess.Popen(exec_string,startupinfo=startupinfo)当用户通过 JumpServer 连接数据库时:
- JumpServer 将连接信息(主机、端口、账号、密码、数据库名等)序列化为 JSON,base64 编码,作为命令行参数传给
main.py app.py解析参数,拼出 DBeaver CLI 连接串- 执行
dbeaver-cli.exe -con "name=...|driver=...|host=...|port=...|user=...|password=...|connect=true" - 轮询 PID 等待用户关闭 DBeaver 后退出会话
3. 升级遇到的问题
3.1 dbeaver-cli.exe 已被移除
从DBeaver 25.2.3起,Windows 安装包不再包含dbeaver-cli.exe(GitHub Issue #39488)。这意味着旧版app.py中的_default_path指向的文件不存在,应用无法启动。
3.2 解决方案:dbeaver.exe 直接替代
好消息是dbeaver.exe本身完全支持同样的-con参数,连接串格式没有任何变化:
dbeaver.exe-con"driver=mysql|host=127.0.0.1|port=3306|database=test|user=root|password=xxx|name=test|connect=true"唯一区别:dbeaver-cli.exe是控制台程序,dbeaver.exe是 GUI 程序,因此启动方式需要调整(去掉CREATE_NEW_CONSOLE和SW_HIDE)。
4. 实战:制作新版手动安装包
整体思路:将setup.yml改为manual类型,让 JumpServer 跳过自动下载安装,同时修改app.py适配新版 DBeaver。
Step 1:修改 setup.yml
# 修改前type:exesource:jms:///download/applets/dbeaver-ce-22.3.4-x86_64-setup.exearguments:-/S-/allusersdestination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver-cli.exemd5:EDA4440D4E32312DD25C9CE5289A228E# 修改后type:manualsource:arguments:[]destination:C:\Program Files\DBeaverprogram:C:\Program Files\DBeaver\dbeaver.exetype: manual告诉 JumpServer跳过下载和安装步骤,直接使用program路径启动应用。source、arguments、md5均可清空。
Step 2:修改 patch.yml
同理,补丁安装也改为 manual:
# 修改前type:msisource:jms:///download/applets/dbeaver-patch-22.3.4-x86_64-setup.msiarguments:-/quietdestination:# 修改后type:manualsource:arguments:[]destination:Step 3:修改 app.py
两处改动:
① 默认路径
# 修改前_default_path=r'C:\Program Files\DBeaver\dbeaver-cli.exe'# 修改后_default_path=r'C:\Program Files\DBeaver\dbeaver.exe'② 启动方式
# 修改前 — 控制台程序需要隐藏窗口startupinfo=subprocess.STARTUPINFO()startupinfo.dwFlags=subprocess.CREATE_NEW_CONSOLE|subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow=subprocess.SW_HIDE exec_string='%s -con %s'%(self.path,params)ret=subprocess.Popen(exec_string,startupinfo=startupinfo)# 修改后 — GUI 程序不需要这些,直接 Popenexec_string='%s -con %s'%(self.path,params)ret=subprocess.Popen(exec_string)dbeaver.exe是 GUI 程序,不需要CREATE_NEW_CONSOLE创建控制台窗口,也不需要SW_HIDE隐藏。
Step 4:更新 manifest.yml 版本号(可选)
version:25.2.5# 写你实际安装的版本Step 5:打包 ZIP
zip-rdbeaver-jumpserver-v25.zip dbeaver/-x"*.DS_Store""__pycache__/*""*.pyc"Step 6:手动安装 DBeaver + 上传
- 在远程应用 Windows 宿主机上,手动安装新版 DBeaver到
C:\Program Files\DBeaver - 将打包好的 ZIP 上传到 JumpServer 应用市场
5. 潜在风险与验证
5.1 进程存活检测
app.py的wait()方法通过tasklist轮询dbeaver.exe的 PID 来判断用户是否关闭了 DBeaver:
defwait(self):wait_pid(self.pid)# 每 5 秒检查一次 PID 是否存活dbeaver-cli.exe作为控制台程序,会在 GUI 打开期间一直存活。dbeaver.exe是 GUI 程序,通常也是这样,但某些情况下主进程可能启动后立即退出、实际窗口在子进程中。建议先在远程机上验证:
# 启动 DBeaver 并记下 PIDdbeaver.exe-con"driver=mysql|host=127.0.0.1|port=3306|database=test|user=root|password=xxx|name=test|connect=true"# 另开终端检查进程tasklist|findstr dbeaver如果dbeaver.exe进程在窗口关闭前一直存在,就没问题。如果启动后立即退出,需要调整wait()逻辑(比如用-reuseWorkspace或进程名匹配)。
5.2 workspace 路径兼容性
app.py中写死了workspace6:
self.app_work_path=r'C:\Users\%s\AppData\Roaming\DBeaverData'driver_yml_path=os.path.join(self.app_work_path,'workspace6','.metadata','.config')DBeaver 25.x 的 workspace 目录是workspace6还是更高版本(如workspace7),需要在新版安装后确认:
%APPDATA%\DBeaverData\如果路径变了,需要修改app.py中init_driver_config()和init_other_config()里的 workspace 路径。
5.3 驱动 XML 兼容性
config/drivers.xml是从 DBeaver 22.3.4 导出的驱动模板。新版 DBeaver 的drivers.xml结构如果发生了变化,_merge_driver_xml()方法可能出问题。如果遇到驱动加载异常,可以从新版 DBeaver 安装目录导出drivers.xml替换config/drivers.xml。
5.4 连接参数兼容性
-con参数格式在 22.x 到 25.x 之间基本保持稳定。已验证的参数:
| 参数 | 说明 |
|---|---|
name | 连接名称 |
driver | 驱动 ID(mysql, postgresql, oracle 等) |
host | 数据库主机 |
port | 端口 |
database | 数据库名 |
user | 用户名 |
password | 密码 |
save | 是否保存连接(false表示临时连接) |
connect | 创建后是否立即连接 |
6. 总结
| 项目 | 改动 |
|---|---|
setup.yml | type: exe→type: manual,program改为dbeaver.exe |
patch.yml | type: msi→type: manual |
app.py | _default_path改为dbeaver.exe,去掉CREATE_NEW_CONSOLE+SW_HIDE |
manifest.yml | version更新为实际版本号 |
整个过程核心思路就是:把自动安装改为手动安装,同时用dbeaver.exe替代已移除的dbeaver-cli.exe。两者接受的-con参数格式完全一致,改动量很小。
如果 JumpServer 远程应用宿主机上有多个 DBeaver 版本,也可以不用manual模式,而是保持type: exe,把新版安装包上传到 JumpServer 文件服务器并更新source和md5,这样就可以继续享受自动安装的便利——只是需要确认新版安装包仍然支持/S /allusers静默参数。