DBeaver 如何添加新的数据库驱动插件
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
如果你的任务是为 DBeaver 增加一种新数据库的连接支持(例如某个只有 JDBC 驱动的数据库),需要完成的是:创建一对 OSGi 插件目录(模型插件,必要时加 UI 插件),在plugin.xml中注册数据源提供者和 SQL 方言,实现少量 Java 类,并把新插件挂进 Maven 构建,最后通过全仓库构建验证。DBeaver 基于 Eclipse RCP + OSGi,每个数据库插件是一个打包为eclipse-plugin的 bundle;整个仓库需要 Java 21(JavaSE-21,不使用 preview 特性)和 Apache Maven(Eclipse Tycho 构建)。
有一个重要的简化前提:AGENTS-New-Database-Driver.md 明确指出,很多驱动只需更新plugin.xml就够了——只有当现有 JDBC 基础设施(org.jkiss.dbeaver.model.jdbc)不能覆盖你的场景时才需要实现 Java 类。本文的主路径同时覆盖“只注册驱动”和“需要写模型类”两种情况,并以仓库中 DuckDB 插件作为可参照的真实示例。
插件目录结构:以 DuckDB 插件为模板
新建插件时,目录结构照 plugins/org.jkiss.dbeaver.ext.duckdb 复制即可。一个最小驱动插件包含四个部分:
META-INF/MANIFEST.MF:bundle 元数据,声明 OSGi 依赖(Require-Bundle);plugin.xml:Eclipse 扩展点注册;pom.xml:Maven 描述符,packaging 必须是eclipse-plugin;src/:bundle 源码目录,由build.properties指定(Tycho 的要求)。
DuckDB 插件的 MANIFEST.MF 说明了典型的 bundle 依赖声明方式——模型层依赖全部通过Require-Bundle头声明,而不是写在pom.xml里(这也是 OSGi 依赖的声明位置):
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: DBeaver DuckDB Model Bundle-SymbolicName: org.jkiss.dbeaver.ext.duckdb;singleton:=true Require-Bundle: org.jkiss.dbeaver.model, org.jkiss.dbeaver.model.sql, org.jkiss.dbeaver.ext.generic, org.jkiss.dbeaver.data.gis Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-21 Export-Package: org.jkiss.dbeaver.ext.duckdb.model, org.jkiss.dbeaver.ext.duckdb.model.data新建插件时把Bundle-SymbolicName、Export-Package换成你的包名,Require-Bundle按实际使用的模块声明(至少要包含模型插件实际依赖的org.jkiss.dbeaver.model和org.jkiss.dbeaver.ext.generic)。
pom.xml 则很短,只需声明 parent 和eclipse-plugin打包方式:
<parent> <groupId>org.jkiss.dbeaver</groupId> <artifactId>plugins</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath>../</relativePath> </parent> <artifactId>org.jkiss.dbeaver.ext.duckdb</artifactId> <version>1.0.79-SNAPSHOT</version> <packaging>eclipse-plugin</packaging>实现哪些 Java 类:按需实现,复用 generic 插件
按 AGENTS-New-Database-Driver.md 的清单,完整实现一个新驱动涉及以下类,但每一项都有“按需”边界:
DBPDataSourceProvider<YourDataSource>:数据源提供者,在plugin.xml的org.jkiss.dbeaver.dataSourceProvider扩展点下注册。官方建议以org.jkiss.dbeaver.ext.generic作为基座插件(大多数数据库插件依赖它),因此可以直接继承 generic 的提供者。DuckDB 的实现就只有一个构造器,见 DuckDBDataSourceProvider.java:public class DuckDBDataSourceProvider extends GenericDataSourceProvider<DuckDBDataSource> { public DuckDBDataSourceProvider() { super(DuckDBDataSource.class); } }JDBCDataSource(来自org.jkiss.dbeaver.model.jdbc):仅当驱动是 JDBC 型且现有 JDBC 基础设施不能覆盖时才实现。SQLDialect(或继承JDBCSQLDialect):SQL 语法特有需要时才写,注册到org.jkiss.dbeaver.sqlDialect扩展点。
文档同时给出了两条硬性约束,写代码前需要知道:
- 不要复制粘贴现有代码,尤其是本地化 bundle 和 SQL 查询,复用现有代码;
- 如果需要修改数据库导航树结构,用
plugin.xml中的treeInjection,而不是整段拷贝 generic 树——大多数数据库的树结构非常相似,复用 better(这是文档原文表述:it is better to reuse it)。
另外两个来自 AGENTS.md 的全局规则会影响你的插件代码:模型插件不得依赖 SWT、JFace 等 UI bundle(模型/UI 分离);每个 Java 文件开头必须是 Apache 2.0 许可头(内容在 docs/license_header.txt),且${current-year}变量要填成当前年份。
plugin.xml 的驱动注册:参考 DuckDB 插件
DuckDB 插件的 plugin.xml 展示了plugin.xml的四种典型注册,前三种是添加驱动时需要关心的:
org.jkiss.dbeaver.dataSourceProvider:声明数据源和驱动本身。核心属性是class(提供者类)、id、label、dialect、parent="generic"(继承 generic 提供者的属性),以及drivers下的驱动定义——class是 JDBC 驱动类(如org.duckdb.DuckDBDriver),sampleURL是样例连接 URL(如jdbc:duckdb:{file}),supportedConfigurationTypes声明支持的手动配置类型(如MANUAL,URL):<extension point="org.jkiss.dbeaver.dataSourceProvider"> <datasource class="org.jkiss.dbeaver.ext.duckdb.model.DuckDBDataSourceProvider" description="DuckDB JDBC connector" id="duckdb" parent="generic" inheritProviderProperties="true" label="DuckDB" icon="platform:/plugin/org.jkiss.dbeaver.ext.generic/icons/duckdb_icon.png" dialect="duckdb"> <drivers managable="true"> <driver id="duckdb_jdbc" label="DuckDB" class="org.duckdb.DuckDBDriver" sampleURL="jdbc:duckdb:{file}" defaultPort="" embedded="true" anonymous="true" description="DuckDB JDBC driver" supportedConfigurationTypes="MANUAL,URL" categories="sql,embedded"> <replace provider="generic" driver="duckdb_jdbc"/> <file type="jar" path="maven:/org.duckdb:duckdb_jdbc:RELEASE" os="win32" arch="aarch64" bundle="!drivers.duckdb"/> <property name="@dbeaver-default-resultset.maxrows.sql" value="true"/> </driver> </drivers> </datasource> </extension>其中
drivers下的file type="jar"节点声明 DBeaver 按操作系统/架构自动下载驱动 jar 的 Maven 坐标(path="maven:/groupId:artifactId:RELEASE",os/arch限定平台);replace节点用于替换 generic 插件中的同名驱动条目。你的新驱动按自己 JDBC 驱动的实际 Maven 坐标和sampleURL填写这两类节点。org.jkiss.dbeaver.generic.meta:把驱动映射到元数据模型(class指向 MetaModel 实现,driverClass填 JDBC 驱动类),DuckDB 对应DuckMetaModel。org.jkiss.dbeaver.sqlDialect:注册 SQL 方言,id与datasource的dialect属性一致,class指向你的方言类(可继承JDBCSQLDialect),parent="generic"表示在通用方言基础上扩展。
此外 DuckDB 还注册了objectManager(对象管理器)和dataTypeProvider(数据类型处理器)两类扩展点,属于针对该数据库特殊类型的可选扩展,简单驱动不需要。
接入构建:修改两处 pom 并加入测试插件
插件创建好后要挂进 Maven 构建,改动两处(见 AGENTS-New-Database-Driver.md):
把新插件目录加入 plugins/pom.xml 的
<modules>列表。以 DuckDB 为例,它的注册行是:<module>org.jkiss.dbeaver.ext.duckdb</module>注意仓库中 UI 插件(
org.jkiss.dbeaver.ext.duckdb.ui)位于独立的 module 分组里;如果你的插件带可选 UI 伴生目录plugins/org.jkiss.dbeaver.ext.{db}.ui/,也同样登记。添加测试插件
test/org.jkiss.dbeaver.ext.{db}.test/并在 test/pom.xml 中注册。测试插件的打包类型是eclipse-test-plugin(见 AGENTS.md)。测试类继承DBeaverUnitTest(来自org.jkiss.dbeaver.osgi.test.runner),需要运行中 OSGi 容器的集成测试用@RunWithApplication/@RunWithProduct注解。并非每个模型插件都有对应测试插件(例如 DuckDB 模型插件目前没有test目录),但文档的建议是模型层函数尽量补单元测试。
构建与验证:只能全量构建,单 bundle 构建会失败
验证新插件是否正确的唯一可靠方式是跑全仓库构建。AGENTS.md 明确说明两点:
- 在单个 bundle 目录里直接
mvn package通常会失败(OSGi 需要全部 bundle 参与构建); - 完整产品构建和全仓库测试都从聚合 POM 发起:
# 全量产品构建 mvn package -f product/aggregate/pom.xml -T1C -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ce # 全仓库构建并运行测试 mvn verify -f product/aggregate/pom.xml -T1C -Pproduct-dbeaver-ce,product-dbeaver-eclipse-cemvn verify会同时构建 desktop DBeaver CE 和 Eclipse 插件产品并执行其中的测试。没有单独的测试命令——测试在mvn install/mvn verify期间由 Tycho 执行。
构建通过、测试全绿,且你在plugins/pom.xml与test/pom.xml中都登记了新模块,就完成了一次新驱动插件的接入。后续要扩展该插件(导航树treeInjection、自定义数据类型处理器、UI 伴生插件),参照 AGENTS-Architecture.md 的模型/UI 分离与命名约定(DBP*平台能力、DBS*结构元数据、DBC*连接、DBD*值处理、DBR*运行时)继续补充即可。
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考