JBoss EAP 7.4为何优先用内置JAXB API而非应用WEB-INF/lib中的JAR?
JBoss EAP类加载与JAR包选择规则
核心类加载逻辑
JBoss EAP采用模块式类加载机制(基于JBoss Modules框架),核心优先级规则如下:
- 内置模块优先于应用本地库:容器将Java EE规范相关的API(如JAXB、JPA、Servlet等)打包为内置模块,存放在
modules/system/layers/base/目录下。默认情况下,应用会自动依赖这些内置规范模块,类加载器会优先从内置模块加载类,而非应用WEB-INF/lib或WEB-INF/classes中的文件。 - 模块依赖驱动加载:每个内置模块通过
module.xml声明依赖关系,类加载器会按依赖链顺序加载类,确保符合Java EE规范的一致性要求。
针对你的JAXB案例的解释
你项目中WEB-INF/lib下的jakarta.xml.bind-api-2.3.3.jar未被加载,反而使用了JBoss内置的jboss-jaxb-api_2.3_spec-2.0.1.Final-redhat-00001.jar,原因是:
JBoss EAP的javax.xml.bind.api内置模块是Java EE JAXB 2.3规范的官方绑定实现,容器默认认为应用应使用容器提供的规范API,避免版本冲突,因此类加载器优先选择了内置模块中的JAXBContext类。
强制使用应用本地JAR的解决方法
如果需要让应用加载自身WEB-INF/lib中的JAXB API包,可以在应用的WEB-INF/jboss-deployment-structure.xml中排除内置的JAXB模块:
<jboss-deployment-structure> <deployment> <exclusions> <!-- 排除JBoss内置的JAXB API模块 --> <module name="javax.xml.bind.api" /> </exclusions> </deployment> </jboss-deployment-structure>
内容的提问来源于stack exchange,提问作者ericj
相关产品推荐
相关产品推荐

