如何给 DBeaver 集成 ECharts 自定义图表组件:从插件骨架到上线的一步到位清单

📅 2026/8/20 18:39:02
如何给 DBeaver 集成 ECharts 自定义图表组件:从插件骨架到上线的一步到位清单
如何给 DBeaver 集成 ECharts 自定义图表组件从插件骨架到上线的一步到位清单【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaverDBeaver 是一款免费开源的通用数据库工具和 SQL 客户端内置图表功能可以帮你把查询结果快速画成柱状图、折线图和饼图。但当运营团队要一张销售热力图、分析师要一张桑基图时原生图表往往力不从心。本文用一条真实的业务需求线贯穿始终带你从零把 ECharts 这类第三方图表库装进 DBeaver最终落地为可复用的自定义图表插件。先说结论为什么原生图表会被卡脖子翻开 DBeaver 源码的图表模块plugins/org.jkiss.dbeaver.ui.charts/你会发现它只有 3 个核心类、1 个插件描述文件和 1 个 Maven 配置BaseChartConstants.java维护一组默认颜色序列DBEAVER_DEFAULT_COLOR_SERIES共 10 种颜色BaseChartComposite.java继承自 JFreeChart 的ChartComposite负责缩放、复制到剪贴板、另存为图片、打印、设置等交互plugin.xml通过org.eclipse.ui.themes扩展点声明了 10 个colorDefinition形成可换肤的配色体系。README 里写得明明白白JFreeChart SWT 组件是从 jfreechart-swt 项目拷贝进来的因为它没有进 Maven 中央仓库。换句话说DBeaver 的图表能力建立在 JFreeChart 之上——JFreeChart 的强项是统计类二维图热力图、桑基图、关系图这类高级货它确实不擅长。pom.xml里也印证了这一点图表模块的依赖极少packaging是eclipse-plugin版本号1.0.183-SNAPSHOT父 POM 指向plugins。这给了我们一个明确的信号DBeaver 并没有把 ECharts、Chart.js 这类专业可视化库内置进来缺口就是我们的切入点。关键认知真正的插卡槽在哪里很多网上教程会教你注册一个叫org.jkiss.dbeaver.dataVisualization.chartProvider的扩展点——我在整个仓库里搜过这个扩展点并不存在。照抄它插件加载时只会得到一个冷冰冰的 Unknown extension point 报错。DBeaver 是 OSGi 插件架构扩展点机制类似电脑主板的卡槽主程序定义插槽第三方插件提供插头。真正的插槽藏在仪表盘模块里。打开plugins/org.jkiss.dbeaver.ui.dashboard/plugin.xml你能看到这么一段声明dashboardView idbrowser labelBrowser iconplatform:/plugin/org.jkiss.dbeaver.ui/icons/misc/browser.svg rendererorg.jkiss.dbeaver.ui.dashboard.browser.DashboardRendererBrowser configurationEditororg.jkiss.dbeaver.ui.dashboard.browser.BrowserChartConfigurationEditor viewSettingsEditororg.jkiss.dbeaver.ui.dashboard.browser.BrowserChartViewSettingsEditor/dashboardView翻译成人话DBeaver 的仪表盘原生支持一种 Browser 视图类型——它会把一个 URL 加载进内嵌的 SWTBrowser组件里渲染并且配置界面里还有一个Resolve variables开关允许在 URL 中解析环境变量和数据库变量见BrowserChartConfigurationEditor.java。这意味着什么意味着 DBeaver 已经为你铺好了一条浏览器即画布的路。ECharts 本来就是跑在浏览器里的 JS 库你不需要去改写 SWT 渲染管线只需要把图表 HTML 页面喂给 Browser把 SQL 查询结果转成 JSON 塞进 ECharts 的 option。渲染层彻底解耦这就是本次 DBeaver 集成 ECharts 的架构支点。动手前的准备清单按顺序勾掉这几项可以少走半天弯路拿到源码clone 仓库https://gitcode.com/GitHub_Trending/db/dbeaver注意整个工程是 Eclipse Tycho Maven 结构别用普通 Java 工程的方式打开。确认 JDK 版本DBeaver 新版要求 JDK 17 以上mvn -v先看一眼。定位图表插件源码通读plugins/org.jkiss.dbeaver.ui.charts/和plugins/org.jkiss.dbeaver.ui.dashboard/两个目录理解BaseChartComposite的生命周期管理构造、dispose、上下文菜单。准备 ECharts 资源下载 echarts.min.js5.x 即可后续要打进插件目录别指望运行时联网。决定集成粒度只想要某个图表页面走 Browser 仪表盘最省事想深度嵌入结果集视图才需要考虑自研 renderer 并注册dashboardView扩展点。本文按前者为主线后者给你留了升级路径。第一步搭出扩展模块的骨架在plugins/下新建目录org.jkiss.dbeaver.ui.charts.ext/这是你插件的家。结构参考原生图表插件保持一致的组织习惯plugins/org.jkiss.dbeaver.ui.charts.ext/ ├── META-INF/ │ └── MANIFEST.MF ├── web/ │ ├── echarts.min.js # 本地打包的 ECharts 库 │ └── heatmap.html # 图表模板页 ├── src/ │ └── org/jkiss/dbeaver/ui/charts/ext/ │ ├── EChartsDashboardRenderer.java # 渲染器实现 │ └── EChartsActivator.java # 插件激活器 ├── plugin.xml └── pom.xmlpom.xml仿照原生图表插件写父 POM 指向plugins打包方式保持eclipse-pluginproject modelVersion4.0.0/modelVersion parent groupIdorg.jkiss.dbeaver/groupId artifactIdplugins/artifactId version1.0.0-SNAPSHOT/version relativePath..//relativePath /parent artifactIdorg.jkiss.dbeaver.ui.charts.ext/artifactId version1.0.0-SNAPSHOT/version packagingeclipse-plugin/packaging /projectMANIFEST.MF里声明它依赖 SWT、工作台和仪表盘模型Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: DBeaver ECharts Extension Bundle-SymbolicName: org.jkiss.dbeaver.ui.charts.ext Bundle-Version: 1.0.0 Bundle-Activator: org.jkiss.dbeaver.ui.charts.ext.EChartsActivator Require-Bundle: org.eclipse.swt, org.eclipse.ui, org.jkiss.dbeaver.ui.dashboard, org.jkiss.dbeaver.model第二步把 ECharts 请进 DBeaver 的浏览器容器核心思路一句话继承DashboardRendererAbstract它在plugins/org.jkiss.dbeaver.ui.dashboard/下已经帮你处理好了工具栏、刷新、设置、关闭等公共交互在createControl里创建 SWTBrowser加载本地 HTML 模板再把数据注入。先写一个极简的heatmap.html注意用占位符__CHART_OPTION__留给 Java 端替换避免拼字符串的转义地狱!DOCTYPE html html head meta charsetutf-8 script srcecharts.min.js/script /head body stylemargin:0;background:transparent; div idcanvas stylewidth:100vw;height:100vh;/div script window.__render function (optionJson) { const chart echarts.init(document.getElementById(canvas)); chart.setOption(JSON.parse(optionJson)); window.addEventListener(resize, function () { chart.resize(); }); }; /script /body /htmlJava 渲染器里你要做三件事定位模板页、把查询数据转成 ECharts 的 option、通过browser.evaluate把 option 传给页面。关键代码长这样public class EChartsDashboardRenderer extends DashboardRendererAbstract { Override public void createControl(NotNull DashboardItemContainer container, NotNull Composite parent, NotNull DashboardItemViewSettings settings) { Browser browser new Browser(parent, SWT.NONE); URL template getClass().getResource(/web/heatmap.html); browser.setUrl(template.toExternalForm()); // 拿到容器绑定的查询把行数据压成热力图坐标 String option buildHeatmapOption(container); // 等页面加载完成后注入数据这里用延迟标志位避免竞态 browser.addProgressListener(ProgressListener.completedAdapter(e - browser.evaluate(window.__render( JSONObject.quote(option) );))); } private String buildHeatmapOption(DashboardItemContainer container) { // 伪代码从 container 的数据模型里取出 维度A、维度B、度量值 // 组装成 { xAxis: [...], yAxis: [...], series: [{ type: heatmap, data: [...] }] } return ...; // 用你熟悉的 JSON 库生成字符串即可 } }几个容易踩的坑提前说browser.setUrl加载本地文件时一定要用toExternalForm()转成 file: URL页面里引用的echarts.min.js用相对路径Browser会以 HTML 所在目录为基准解析注入 JSON 时外层必须再包一层引号并转义否则 JS 侧JSON.parse会直接炸。第三步注册扩展点让 DBeaver 认识你的图表有了渲染器还得在plugin.xml里把它挂到仪表盘上。注意id必须全局唯一renderer指向你的实现类?xml version1.0 encodingUTF-8? ?eclipse version3.4? plugin extension pointorg.jkiss.dbeaver.dashboardView dashboardView idecharts.heatmap labelECharts Heatmap rendererorg.jkiss.dbeaver.ui.charts.ext.EChartsDashboardRenderer configurationEditororg.jkiss.dbeaver.ui.dashboard.browser.BrowserChartConfigurationEditor/ /extension /plugin这里有个小技巧配置编辑器直接复用现成的BrowserChartConfigurationEditor你的用户就能像配置普通 URL 仪表盘一样配置这个热力图学习成本趋近于零。想让图表配色和 DBeaver 主题保持一致就再补一个颜色扩展点把原生图表插件的颜色插槽复制一份到你自己的插件里。原生plugin.xml的写法是声明org.eclipse.ui.themes扩展点下的colorDefinition每项带一个 RGB 值例如206, 63, 34就是 DBeaver 图表系列的第一种颜色。你的扩展插件可以这样同步extension pointorg.eclipse.ui.themes colorDefinition idorg.jkiss.dbeaver.ui.charts.ext.color.1 categoryIdorg.jkiss.dbeaver.ui.data.chart labelECharts Series Color 1 value206, 63, 34/ /extension然后在 Java 端通过主题管理器读取这个颜色写进 ECharts 的color数组。这样用户切换深色/浅色主题时你的热力图不会显得格格不入——细节决定观感。验证与部署把插件跑起来先本地验证再考虑分发。DBeaver 产品定义在product/community/DBeaver.product调试时把新插件加进产品配置plugin idorg.jkiss.dbeaver.ui.charts.ext/然后从工程根目录执行mvn clean verify -Pdebug-Pdebug会启动带调试端口的开发实例你可以直接连上 IDE 断点。验证通过后打包分发mvn package -DskipTests产出物在target/下把它拷进 DBeaver 安装目录的plugins/文件夹重启应用即可生效。如果你用 Maven 私服管理内部插件也可以用mvn install装进本地仓库按项目现有的依赖管理规范走。图表白屏按这份排查清单过一遍症状大概率原因排查手法整个区域空白URL 加载失败或文件路径错误把browser.setUrl的地址复制到系统浏览器打开页面出来了图表不渲染option 注入失败或 JS 报错browser.evaluate返回值打日志临时加window.onerror上报图表渲染但数据是旧的注入时机早于页面加载完成确认用ProgressListener而不是setUrl后立即注入尺寸塌陷成一行容器没有给 Browser 布局数据给 Browser 设置GridData(FILL_BOTH)或FillLayout深色主题下颜色刺眼没有走主题色扩展点检查colorDefinition是否被正确读取再往前走一步性能与进阶BaseChartComposite的源码提醒我们一件事SWT 组件有明确的dispose生命周期Browser 也是一样。在渲染器里给 Browser 挂上addDisposeListener释放页面里 ECharts 实例的定时器和事件监听防止仪表盘反复开关时内存悄悄涨上去。数据量大的时候别把整张表塞给前端。DBeaver 原生图表的经验是先采样再渲染你在 Java 端做聚合或抽稀比如按时间桶降采样ECharts 只负责画页面响应会明显变快。还可以把 option 生成逻辑做成缓存查询结果没变就不重建 JSON。至于更深的集成——比如把自定义图表直接嵌进 SQL 结果集的图表标签页——方向是自研一个完整的DashboardItemRenderer并复刻原生图表的右键菜单缩放、复制、另存为参考BaseChartComposite.fillContextMenu的写法。骨架搭好之后剩下的就是数据模型对接的体力活。小结回顾这条从运营要一张热力图到插件上线的完整链路你会发现核心其实只有三件事看懂 DBeaver 现有图表插件的边界、找到 Browser 仪表盘这个现成插槽、把数据转成 ECharts 认识的 JSON。DBeaver 的 OSGi 架构决定了它的扩展路径是先找插槽、再造插头而不是凭空发明扩展点。照着这份清单走一遍你的第一个 DBeaver 自定义图表组件就能稳稳落地下次再有新的图表需求不过是换一个 HTML 模板的事。【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考