DBeaver 单 bundle 构建或测试执行失败怎么排查
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
在 DBeaver Community Edition 仓库里做二次开发时,最容易卡住的一步是:在某个插件目录(例如plugins/org.jkiss.dbeaver.ext.postgresql)或某个测试插件目录里直接执行mvn package或跑测试,结果失败。这不是偶发问题——AGENTS.md 明确说明:单个 bundle 用mvn package构建"通常失败",单个 bundle 里的测试"通常失败"。这篇文章基于仓库内的 AGENTS.md、pom.xml、product/pom.xml、tools/build.sh、tools/build.cmd 和 CI 工作流,说明这类失败的文档化原因,以及应该走哪条全量构建/测试路径来完成任务。
为什么单 bundle 运行会失败(文档给出的原因)
先对照 AGENTS.md 中的 "Build System" 一节确认失败是否在文档预期之内:
- 单 bundle 构建:
Building a single bundle with mvn package in bundle folder usually fails. - 单 bundle 测试:
Running tests in a single bundle usually fail because OSGI needs ALL bundles to be included in build OR be installed in .m2. - 依赖不来自 Maven:所有 OSGi 依赖来自 Eclipse P2 仓库(标准 Eclipse P2 + DBeaver 自定义 P2,见 AGENTS.md 中
repo.p2.eclipse.url的说明),而不是 Maven。自定义 P2 仓库的源码仓库是dbeaver-deps-ce,它把经典 Maven 依赖转换成 P2 bundle。 - bundle 间依赖不走 pom.xml:bundle 之间的依赖声明在
META-INF/MANIFEST.MF的Require-Bundle头里,不在pom.xml中。
另外,根 pom.xml 的<parent>指向com.dbeaver.common.main,relativePath为../dbeaver-common/pom.xml——即父 POM 在 dbeaver 仓库的同级目录中解析。如果同级目录缺少dbeaver-common,Maven 在解析任何子模块前就会失败。
因此判断顺序是:你的失败如果发生在"单个 bundle 目录内的独立 Maven 运行",属于文档记录的预期行为;此时正确做法不是修那个目录,而是切换到全量构建路径并核对前置环境。
前置环境核对
在运行任何全量构建前,按 AGENTS.md 的 "Repo dependencies" 一节核对:
- 同级仓库齐全。本仓库根目录的 project.deps 是一个简单文本文件,每行一个依赖仓库名,当前内容为
dbeaver-common和datadam-api。文档要求所有相关仓库克隆在同一个目录(DBEAVER_DEV_HOME,即 dbeaver 仓库的父目录)。这一点也可以从 product/aggregate/pom.xml 得到印证:聚合 POM 的 modules 直接引用了../../../dbeaver-common和../../../datadam-api/apis。 - JDK 版本。AGENTS.md 的 "Common Pitfalls" 一节的记录:构建要求 Java 21,target platform 为
JavaSE-21,不要使用 preview 特性。 - 测试插件归属。测试插件位于
test/目录,镜像对应的生产插件(如test/org.jkiss.dbeaver.ext.postgresql.test/)。它们通过根 pom.xml 中的desktopprofile 参与构建——该 profile 在headless-platform属性未设置时激活(默认激活),把test模块加入构建;设置headless-platform属性后测试模块不再参与。文档同时说明:没有单独的"只跑测试"Maven 命令,测试是在mvn install或mvn verify的标准构建过程中执行的。
用全量构建命令复现正确路径
AGENTS.md 给出的两条文档命令(原样保留):
# 完整产品构建 mvn package -f product/aggregate/pom.xml -T1C -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ce# 全仓库测试(会运行 desktop dbeaver ce 与 dbeaver eclipse 插件的测试) mvn verify -f product/aggregate/pom.xml -T1C -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ceMaven profile 列表可以在 product/pom.xml 中核对,当前包含三个产品 profile,各自启用的模块为:
| profile | 启用模块 |
|---|---|
product-dbeaver-ce | community |
product-dbeaver-eclipse-ce | repositories |
product-dbeaver-ce-msstore | community-msstore |
如果目标是构建其他产品,按 AGENTS.md 的说明改用product/pom.xml中列出的对应 profile 替换上面的-P参数。
替代路径:仓库自带的构建脚本
tools/下提供了两个封装了"克隆依赖仓库 + 执行聚合构建"的脚本,适合首次搭建环境时使用。注意它们会修改仓库之外的目录,使用前提如下。
tools/build.sh(POSIX shell),流程为:
- 检查
git是否存在,缺失则报错退出; - 若 dbeaver 仓库的父目录下没有
dbeaver-common,则执行git clone克隆该仓库(脚本内写明来源地址)。副作用是会在父目录新增一个dbeaver-common目录,需要你确认当前目录有写入权限; - 执行 dbeaver-common 提供的 Maven wrapper:
"$DBEAVER_COMMON_DIR/mvnw" clean install -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ce,appstore -T 1C -f "$AGGREGATE_DIR"其中AGGREGATE_DIR即product/aggregate。脚本在 Maven 成功后打印Build completed successfully(脚本自身的日志消息)。
tools/build.cmd(Windows):同样在缺失时克隆dbeaver-common,然后执行dbeaver-common\mvnw.cmd clean package -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ce,appstore -T 1C,指向%workspaceDir%\dbeaver\product\aggregate——即 Windows 脚本假设 dbeaver 仓库检出在dbeaver命名的子目录中,目录结构不符时-f路径会指向不存在的位置。
两条文档路径的差异(按文档如实保留,未做统一):AGENTS.md 使用系统mvn执行package;tools/build.sh使用 dbeaver-common 的mvnw执行clean install并额外加上appstoreprofile;tools/build.cmd使用mvnw.cmd clean package同样带appstoreprofile。appstoreprofile 不在 product/pom.xml 的三个 profile 之列。
结果验证与判断
- 单 bundle 运行失败、全量命令成功:与文档记录的"单 bundle 通常失败"一致,无需进一步处理该目录;后续验证改动以全量
mvn verify为准。 - 全量构建脚本运行:以 tools/build.sh 为例,脚本带
set -e,Maven 失败会直接中断,看到Build completed successfully说明聚合构建(含 dbeaver-common、datadam-api、dbeaver 三个模块树)成功。 - 与 CI 对齐:PR 检查工作流 .github/workflows/push-pr-devel.yml 的 build 任务使用的参数是
project-directory: ./dbeaver/product/aggregate、project-deps: ./dbeaver/project.deps、mvn-args: -Pproduct-dbeaver-ce,product-dbeaver-eclipse-ce,另有一个独立的 checkstyle 检查任务。本地复现 CI 失败时,按这套参数组合在dbeaver-common所在的父目录执行,可以排除"本地与 CI 参数不一致"这一变量。
限制
- 文档只给出"单 bundle 构建/测试通常失败"这一结论性说明,没有针对具体报错日志的逐条诊断表;排查能落到"是否单 bundle 独立运行、前置仓库与 JDK 是否满足"这一层。
- 依赖问题(缺少第三方类、缺 bundle)应到
Require-Bundle头与 P2 仓库配置中找原因,pom.xml不是 bundle 间依赖的声明位置。 - 没有"只运行某一个测试插件"的文档化命令;改动验证只能走全量
mvn verify,耗时以实际机器为准,文档未给出固定时长。
【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考