将Spring Boot应用部署至WebLogic时遇错误求排查思路
排查Spring Boot部署WebLogic时ASM相关部署错误的思路
首先,这个报错的核心是WebLogic自带的ASM工具无法解析你的应用中的类字节码,大概率是字节码版本不兼容或者类加载优先级冲突导致的,给你几个具体的排查方向:
1. 检查Java编译版本与WebLogic支持版本的匹配性
- 先确认你的WebLogic版本支持的Java版本:比如WebLogic 12.1.3最高支持Java 8,12.2.1及以上才支持Java 11等更高版本。
- 检查Spring Boot应用的编译配置:在
pom.xml里查看maven-compiler-plugin的source和target参数,确保它们不超过WebLogic支持的Java版本。比如针对WebLogic 12.1.3,要把参数设为1.8:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> - 同时检查IDE的项目SDK设置,确保编译时用的是WebLogic兼容的Java版本,避免IDE默认用更高版本编译。
2. 处理Spring Boot与WebLogic的ASM类加载冲突
WebLogic自带了旧版本的ASM库,而Spring Boot依赖的ASM版本通常更高,容易出现类加载冲突。可以通过weblogic.xml配置让WebLogic优先加载应用内的ASM类:
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"> <!-- 其他已有配置 --> <container-descriptor> <prefer-application-packages> <package-name>org.objectweb.asm.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>
另外也可以检查pom.xml,确保Spring Boot的ASM依赖没有重复引入或者版本冲突的情况。
3. 修正SpringBootServletInitializer的实现
注意SpringBootServletInitializer已经实现了WebApplicationInitializer接口,不需要额外再实现这个接口,你的启动类只需按规范重写configure方法即可:
@SpringBootApplication public class MyApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyApplication.class); } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
重复实现接口可能会引发不必要的初始化问题。
4. 验证WAR包的打包内容
- 解压生成的WAR包,确认
WEB-INF/lib下没有spring-boot-starter-tomcat依赖(因为你已经把它的scope设为provided),如果存在的话,说明打包配置有问题,需要检查pom.xml的依赖配置是否正确。 - 用
javap -verbose 类名命令查看WEB-INF/classes下的类文件版本号,比如Java 8对应的版本号是52.0,确保和WebLogic支持的版本匹配。
5. 查看完整的WebLogic日志
你提供的日志是截断的,建议去WebLogic的服务器日志目录(一般是domain_name/servers/server_name/logs)查看完整堆栈信息,里面通常会提到具体是哪个类导致ASM解析失败,能帮你更精准定位问题。
内容的提问来源于stack exchange,提问作者rui
相关产品推荐
相关产品推荐

