本文详解在 wildfly 14 中通过 bom(bill of materials)统一管理依赖版本时,为何 `cdi-api` 无法解析,并给出完整配置方案:必须为 bom 声明 `import` scope,且需选用 `wildfly-javaee8` bom,同时将 `cdi-api` 设为 `provided` 作用域。
在基于 Maven 构建 WildFly 应用时,合理利用官方 BOM 是避免版本冲突、提升可维护性的关键实践。但许多开发者初次尝试时会遇到类似错误:
[ERROR] 'dependencies.dependency.version' for javax.enterprise:cdi-api:jar is missing.
这并非 cdi-api 本身缺失,而是 BOM 未被正确“导入” —— Maven 的
首先,在父 POM 的
org.wildfly.bom wildfly-javaee814.0.1.Final pom import
? 补充说明:wildfly-javaee8 BOM 明确导入了 Jakarta EE 8(当时仍以 javax.* 命名空间发布)相关 API 的版本定义,包括 javax.enterprise:cdi-api:2.0,而 wildfly BOM 主要用于 WildFly 服务器自身模块依赖,不覆盖规范 API。
其次,在子模块的
javax.enterprise cdi-apiprovided
原因在于:WildFly 14 原生提供 CDI 运行时(cdi-api 由服务器 classpath 提供),若不设为 provided,Maven 会将其打包进 WAR/EAR,不仅冗余,更可能引发类加载冲突或 ClassCastException。
-Dincludes=javax.enterprise:cdi-api,应看到 cdi-api:2.0 被解析且 scope 为 compile(由 BOM 注入),而实际运行时由容器提供; 遵循以上配置,即可零版本号声明、安全集成 CDI API,充分发挥 WildFly BOM 的标准化治理能力。