WebSphere 8.5.5部署Spring Boot 2.2.2报错:为何加载META-INF中application.xml?
问题分析与解决方案
这个问题的核心是WebSphere的类加载机制和Spring Boot默认配置扫描逻辑的冲突,具体原因和解决办法如下:
为什么会出现这个问题?
WebSphere 8.5.5在部署EAR包时,会把EAR根目录下META-INF/application.xml(Java EE标准的EAR部署描述符)暴露给应用的类加载器,让它在类路径的根目录下可见。而Spring Boot 2.2.x的ConfigFileApplicationListener默认会扫描类路径根目录下的application.xml作为配置文件(因为Spring Boot支持XML格式的配置源),于是就误把EAR的部署描述符当成了Spring的配置文件去加载,最终因格式不匹配抛出IllegalStateException。
可行的解决方案
- 明确指定Spring Boot配置文件:通过启动参数或环境变量,直接告诉Spring Boot要加载的配置文件,避免它去扫描根目录下的
application.xml。比如:- 在WebSphere的应用启动参数中添加:
--spring.config.name=my-app-config(假设你的Spring配置文件是my-app-config.xml) - 或者指定具体路径:
--spring.config.location=classpath:/config/application.xml(如果配置文件放在src/main/resources/config目录下)
- 在WebSphere的应用启动参数中添加:
- 调整Spring配置文件的存放路径:把你的Spring XML配置文件放在类路径的子目录(比如
src/main/resources/config)下,这样Spring Boot默认扫描根目录时就不会碰到EAR的部署描述符。 - 修改WebSphere类加载策略:尝试将WebSphere的类加载模式设置为
PARENT_LAST,让应用优先加载自身类路径下的文件,避免WebSphere的EAR部署描述符被提前加载。不过这种调整可能影响其他依赖的加载,需要做好测试。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

