如何正确使用 WildFly BOM 管理 CDI API 依赖

本文详解在 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 是一个“元依赖清单”,必须通过 import 显式激活其内容。

✅ 正确配置:BOM 导入 + 依赖声明

首先,在父 POM 的 中,必须指定 scope=import 且选用 wildfly-javaee8 BOM(而非通用 wildfly BOM),因为后者不包含 Java EE 8 规范 API(如 cdi-api)的版本映射:


  
    
      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。

其次,在子模块的 中声明 cdi-api 时,必须添加 provided


  
    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 的标准化治理能力。