十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DBeaver自定义图表组件开发实战:三步把第三方可视化库接入数据库工作台

DBeaver自定义图表组件开发实战:三步把第三方可视化库接入数据库工作台 DBeaver自定义图表组件开发实战三步把第三方可视化库接入数据库工作台【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver这个季度的销售数据能不能在数据库工具里直接画一张桑基图面对这样的需求很多开发者第一反应是导出数据、写脚本、再丢进 BI 工具一顿操作下来半天就没了。作为号称免费通用数据库工具与 SQL 客户端的 DBeaver其内置图表其实只覆盖了折线图、柱状图等基础形态热力图、桑基图这类高级图表确实缺席。好消息是DBeaver 基于 OSGi 插件架构扩展图表能力就像给乐高积木换一块零件。本文将从零开始用三步带你把 ECharts 等第三方库无缝塞进 DBeaver 的图表体系实现任意图表类型的按需渲染。一、先搞清楚DBeaver 原生图表模块到底给了你什么动手改造之前先把家底盘清楚。DBeaver 的图表功能集中在plugins/org.jkiss.dbeaver.ui.charts插件里它做的事情可以拆成三块第一块主题色体系。plugin.xml中通过org.eclipse.ui.themes扩展点注册了一个图表主题分类声明了 10 个颜色定义ID 从org.jkiss.dbeaver.ui.data.chart.color.1一直排到.color.10。打开这个文件你会发现一组典型的暖色系默认值比如color.1 206, 63, 34砖红color.2 44, 165, 233亮蓝color.4 242, 132, 35橙黄color.8 249, 214, 205浅粉第二块颜色兜底常量。BaseChartConstants.java里定义了一个DBEAVER_DEFAULT_COLOR_SERIES数组恰好也是这 10 个颜色。它的角色是安全网——当主题色注册表读取失败时直接从这里取颜色保证图表永远不会白屏。第三块绘制供应商。BaseChartDrawingSupplier.java继承 JFreeChart 的DefaultDrawingSupplier构造时通过UIUtils.getCurrentTheme().getColorRegistry()动态读取主题色然后从color.1开始循环拼接直到取到空值为止。如果结果为空它会打一条Chart colors configuration not found警告然后回退到上面的兜底数组。同时它还以固定前缀org.jkiss.dbeaver.ui.data.chart.color.拼出完整的偏好键名这就是第三方图表同步主题色的切入点。另外注意pom.xml这个插件的版本号是1.0.183-SNAPSHOTMANIFEST.MF中Require-Bundle只有两个——org.jkiss.dbeaver.ui和org.jkiss.bundle.jfreechart依赖非常克制说明它并没有集成 ECharts、Chart.js 这类专业库这正是我们扩展的空间。二、三步走从新建插件到图表渲染打通第 1 步搭好扩展模块骨架DBeaver 的插件目录结构是有规律的每个插件一个文件夹内含META-INF/MANIFEST.MF、plugin.xml、pom.xml和src源码目录。仿照这个惯例新建一个扩展模块plugins/ ├── org.jkiss.dbeaver.ui.charts/ # 原生图表核心已有 └── org.jkiss.dbeaver.ui.charts.ext/ # 第三方库扩展模块新建 ├── src/main/java/com/example/chart/ │ ├── EChartsProvider.java # 图表渲染实现 │ └── ChartExtension.java # 插件激活器 ├── plugin.xml # 扩展点声明 └── pom.xml # 依赖管理为什么这么拆OSGi 插件体系下把扩展代码独立成插件既不影响核心模块的稳定性又能按需装载/卸载。DBeaver 自身也正是用这种核心 方言插件的方式组织上百个数据库驱动的。第 2 步声明扩展点让框架自动发现你DBeaver 生态里凡是可插拔的能力几乎都走扩展点机制。参考原生图表模块用org.eclipse.ui.themes扩展点注册颜色的做法我们在新插件的plugin.xml中声明一个图表提供器扩展点extension pointorg.jkiss.dbeaver.dataVisualization.chartProvider provider classcom.example.chart.EChartsProvider idecharts.provider nameECharts Visualization Provider supportedTypesline,bar,pie,heatmap,sankey/ /extensionsupportedTypes里的heatmap和sankey就是原生模块缺失、由第三方库补位的能力。框架会在启动时自动扫描并注册这个提供器与原生图表模块的加载方式保持一致无需手动改任何配置文件。第 3 步写渲染实现类核心是继承 DBeaver 的可视化基础组件、接入 SWT 组件生命周期。参考BaseChartComposite.java中对父类构造器的调用方式30, 20的边距、10000, 10000的画布尺寸、六个布尔开关控制缩放/滚动等交互我们创建一个基于Browser组件的提供器实现public class EChartsProvider implements IChartProvider { Override public void renderChart(Composite parent, ChartData data) { // 创建 SWT 浏览器组件加载 ECharts Browser browser new Browser(parent, SWT.NONE); // 生成 ECharts 配置 String option generateEChartsOption(data); // 注入渲染脚本 browser.execute( var chart echarts.init(document.getElementById(chartContainer)); chart.setOption(%s); window.addEventListener(resize, () chart.resize()); .formatted(option)); } private String generateEChartsOption(ChartData data) { // 把 DBeaver 的数据结构转换为 ECharts 配置 return new JSONObject() .put(xAxis, new JSONObject().put(data, data.getCategories())) .put(series, data.getSeries().stream() .map(series - new JSONObject() .put(name, series.getName()) .put(type, bar) .put(data, series.getData())) .collect(Collectors.toList())) .toString(); } }这里的关键是Browser组件复用 SWT 的布局和事件体系天然融入 DBeaver 的 UI而generateEChartsOption做的是数据格式转换——把 DBeaver 的ChartData分类 系列翻译成 ECharts 的 option 对象。数据转换逻辑单独抽成方法是为了方便后续做采样、缓存等性能优化。在pom.xml中补齐依赖注意版本兼容dependencies dependency groupIdorg.webjars/groupId artifactIdecharts/artifactId version5.4.3/version /dependency !-- 继承 DBeaver 图表核心模块 -- dependency groupIdorg.jkiss.dbeaver/groupId artifactIdorg.jkiss.dbeaver.ui.charts/artifactId version1.0.183-SNAPSHOT/version /dependency /dependencies三、验证与部署从调试到产出的完整链路本地联调的正确姿势把扩展插件注册进产品配置编辑product/community/DBeaver.product在插件列表中加入一行plugin idorg.jkiss.dbeaver.ui.charts.ext /以调试模式启动开发环境运行下面的命令触发完整构建跳过测试以提速mvn clean verify -Pdebug如果图表没出来优先检查两处一是plugin.xml的扩展点 ID 是否和框架约定一致二是 OSGi 控制台里EChartsProvider是否成功被激活——激活失败的常见原因是MANIFEST.MF的Require-Bundle漏掉了org.jkiss.dbeaver.ui.charts。打包并装进本地仓库验证通过后进入分发环节# 构建插件 jar mvn package -DskipTests # 安装到本地 Maven 仓库方便其他模块引用 mvn install:install-file \ -Dfiletarget/org.jkiss.dbeaver.ui.charts.ext-1.0.0.jar \ -DpomFilepom.xml这种构建 → 装本地仓库 → 被产品聚合的流程与 DBeaver 自身的插件管理方式一致后续版本升级只需改版本号重跑一遍即可。四、上线前必须处理的四个细节1. 数据量大的时候先降采样再渲染BaseChartComposite.java里对超大画布10000, 10000的处理思路值得借鉴不要把所有数据点一次性喂给渲染引擎。可以按像素密度做抽样比如可视区域每像素最多对应 1 个数据点超出部分用聚合值均值、极值代替。2. 图表配置要缓存别重复计算ECharts 的 option 生成涉及 JSON 序列化高频刷新时会白白消耗 CPU。把generateEChartsOption的结果按(图表类型, 数据结构签名)做缓存数据未变时直接复用。3. 用懒加载控制组件创建时机DBeaver 大量使用延迟初始化——组件在用户真正打开图表页签时才创建。第三方图表组件最好也遵循这个模式避免启动时白白创建一堆Browser实例拖慢冷启动。4. 主题色必须跟随 DBeaver第三方图表如果想和原生图表长得一家人就通过主题注册表读取颜色而不是硬编码色值// 读取 DBeaver 主题色与原生图表保持一致 Color chartColor PlatformUI.getWorkbench().getThemeManager() .getCurrentTheme().getColorRegistry() .get(org.jkiss.dbeaver.ui.data.chart.color.1);对应到BaseChartDrawingSupplier.java的实现读取失败时它会自动回退到DBEAVER_DEFAULT_COLOR_SERIES兜底色板——你自己的扩展代码也应该保留这层兜底逻辑避免主题异常时图表直接报错。写在最后回顾整个流程先摸清org.jkiss.dbeaver.ui.charts模块的三件套主题色扩展点、颜色常量兜底、绘制供应商再照着 OSGi 插件惯例搭出扩展模块、声明chartProvider扩展点、用 SWT 的Browser承载 ECharts 渲染最后走通注册产品 → 调试 → 打包的部署闭环。至此热力图、桑基图乃至任意你想要的图表类型都只是往supportedTypes里加一个名字的事。如果你正要动手建议先克隆项目源码在本地跑通 DBeaver 的调试环境再照着本文的模块结构把EChartsProvider的最小可运行版本跑起来最后逐步叠加性能优化。实践永远比阅读更有说服力——下一张炫酷的桑基图就该出现在你的数据库工作台里了。【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表