基于STS开发Spring Boot1.4.2应用遇UnsupportedClassVersionError报错求助
这个问题我之前帮不少开发者解决过,核心原因很明确:你遇到的java.lang.UnsupportedClassVersionError是因为javax.annotation.ManagedBean类是用**Java 7(major.minor版本51.0)**编译的,但WebLogic 10的运行环境是Java 6(对应版本50.0),Java低版本虚拟机无法加载高版本编译的类,自然就抛出异常了。而Spring Boot 1.4.x默认依赖的部分库引入了Java 7编译的类,和WebLogic 10的Java 6环境产生了冲突。
下面是具体的解决方案,按步骤来就行:
1. 排除高版本的javax.annotation依赖
WebLogic 10本身自带了J2EE 5规范的相关API,其中就包含了适配Java 6的javax.annotation类。所以我们要做的就是让Spring Boot应用放弃自带的高版本依赖,转而使用WebLogic容器提供的版本。
如果用Maven管理依赖,在pom.xml里给Spring Boot的starter添加排除规则:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> </exclusion> </exclusions> </dependency>
这样就能去掉Spring Boot自动引入的Java 7版本的javax.annotation-api依赖了。
2. 强制项目编译级别为Java 6
不管是自己写的代码还是依赖的兼容库,都得确保是Java 6编译的才能在WebLogic 10上跑。
在STS里设置编译级别:
右键项目 → Properties → Java Compiler,勾选「Enable project specific settings」,然后把「Compiler compliance level」改成1.6。
在Maven里配置编译插件:
在pom.xml的build节点下添加编译插件配置,确保编译输出符合Java 6规范:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
3. 配置Spring Boot与WebLogic 10的兼容性
Spring Boot应用部署到传统Java EE容器(比如WebLogic)需要一些特殊配置,才能避免类加载冲突:
改成WAR打包方式
在pom.xml里把打包类型改成war:
<packaging>war</packaging>
修改启动类继承SpringBootServletInitializer
让你的Spring Boot启动类继承SpringBootServletInitializer并重写configure方法,这样WebLogic才能正确识别并启动应用:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
添加weblogic.xml配置
在src/main/webapp/WEB-INF下创建weblogic.xml,配置WebLogic优先加载应用中的Spring和Jackson类,避免和容器自带的旧版本类冲突:
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.springframework.*</wls:package-name> <wls:package-name>com.fasterxml.jackson.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
按照这几步操作下来,应该就能解决这个版本不兼容的问题了。
内容的提问来源于stack exchange,提问作者osama yaccoub

