
本文详解在 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 的
✅ 正确配置:BOM 导入 + 依赖声明
首先,在父 POM 的
org.wildfly.bom wildfly-javaee8 14.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-api provided
原因在于:WildFly 14 原生提供 CDI 运行时(cdi-api 由服务器 classpath 提供),若不设为 provided,Maven 会将其打包进 WAR/EAR,不仅冗余,更可能引发类加载冲突或 ClassCastException。
⚠️ 常见误区与验证建议
- ❌ 错误:遗漏
import → BOM 内容不生效,Maven 无法推导 cdi-api 版本; - ❌ 错误:使用 wildfly:14.0.1.Final BOM → 其 dependencyManagement 不声明 cdi-api,导致版本缺失;
- ✅ 验证方式:执行 mvn dependency:tree -Dincludes=javax.enterprise:cdi-api,应看到 cdi-api:2.0 被解析且 scope 为 compile(由 BOM 注入),而实际运行时由容器提供;
- ✅ 进阶提示:若项目需兼容 Jakarta EE 9+(jakarta.enterprise:cdi-api),请升级至 WildFly 23+ 并改用 wildfly-jakartaee8 或对应 Jakarta BOM。
遵循以上配置,即可零版本号声明、安全集成 CDI API,充分发挥 WildFly BOM 的标准化治理能力。










