WebLogic12无外网启动报WELD-001210校验beans.xml失败
问题根因
- WebLogic 12c 内置JBoss Weld作为CDI规范的默认实现,容器启动阶段会自动扫描应用
WEB-INF目录下所有名为beans.xml的文件,严格按照文件内xsi:schemaLocation声明的地址拉取XSD文件做合法性校验。部署环境无公网访问权限,无法拉取远程托管的Spring XSD文件,因此抛出读取失败警告,最终阻断应用启动。 - WebLogic 10 未默认集成CDI容器,不会触发上述XSD联网校验逻辑,因此相同配置的应用可正常运行。
- 核心冲突:存放于
WEB-INF下的beans.xml为Spring框架配置文件,文件名与CDI规范要求的配置文件名完全一致,Weld会误将Spring配置识别为CDI配置执行校验。即使Maven依赖中已包含对应版本的Spring XSD文件,Weld默认校验逻辑也不会优先加载classpath内的本地XSD资源,而是优先请求远程地址。
解决方案
按实施成本从低到高排序:
- 重命名Spring配置文件
不要将Spring配置文件以beans.xml命名存放在WEB-INF目录下,改为自定义名称如applicationContext.xml、spring-config.xml即可,Spring加载配置时指定对应文件路径即可正常读取。Weld不会扫描非beans.xml命名的文件,从根源避免误识别问题,无额外配置侵入。 - 关闭Weld的XSD校验逻辑
若业务要求必须在WEB-INF路径保留beans.xml文件,可在WebLogic域启动脚本中添加如下JVM启动参数,直接关闭Weld对XML配置的XSD校验能力:
参数添加完成后重启实例即可生效,不会再触发远程XSD拉取逻辑。-Dorg.jboss.weld.xml.disableValidating=true - 配置本地XSD资源映射
若既不能修改配置文件名,也不能调整域级别的全局启动参数,可在应用WEB-INF/weblogic.xml中添加容器级schema映射,将远程XSD地址指向应用依赖包内的本地XSD资源,让Weld校验时直接读取本地文件,示例配置如下:
配置中的classpath路径需要和本地依赖内XSD文件的实际路径保持一致。<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"> <container-descriptor> <schema-mapping> <namespace>http://www.springframework.org/schema/beans</namespace> <schema-location>classpath:org/springframework/beans/factory/xml/spring-beans.xsd</schema-location> </schema-mapping> <schema-mapping> <namespace>http://www.springframework.org/schema/aop</namespace> <schema-location>classpath:org/springframework/aop/config/spring-aop.xsd</schema-location> </schema-mapping> <schema-mapping> <namespace>http://cxf.apache.org/jaxws</namespace> <schema-location>classpath:schemas/jaxws.xsd</schema-location> </schema-mapping> </container-descriptor> </weblogic-web-app>
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

