省流:使用jdk1.8执行17编译的包,启动报错。
背景:
项目运行中难免出现服务器环节集成其它jar包的情况,而其它jar包的jdk版本可能和我们业务项目的jdk版本不一致,如果比我们业务版本低,那么可能不会出现问题, 因为jdk向下兼容,如果jdk版本比我们业务版本高,可能就会出现编译无法运行的情况。
我遇到的问题:
我的业务项目A是一个springboot项目,部署在服务器上,服务器的运行环境为jdk1.8,现在我需要在这个服务器上部署另外一个项目B,但是项目B使用的编译环境为17(但是项目B需要没有8版本以上的代码写法,如果你的项目B有8以上的写法,可能无法使用17编译成8的版本启动!)
然后我在1.8的jdk运行环境下执行17编译的包,启动提示报错信息:
Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file
Exception in thread "main"
java.lang.UnsupportedClassVersionError:
com/nuctech/init/WebApplication has been compiled by
amore recent version of the Java Runtime
(class file version 61.0) this version of the Java Runtime
only recognizes class file versions up to 52
原因分析:
报错大意为:无法使用1.8的环境(52对应jdk1.8)运行17(61对应的jdk17)的程序。
解决方案:
一:设置编译的jdk环境为低版本环境:
如果你使用Maven来编译代码, 在Maven的pom.xml文件中,添加配置:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target></properties>
如果你使用Gradle来编译代码,在Gradle的build.gradle文件中,配置:
tasks.withType(JavaCompile) { sourceCompatibility = '8' targetCompatibility = '8'}
二:设置运行的jdk环境为高版本环境
安装jdk17,修改环境变量为17的环境变量,这样既可以向下兼容项目A 又可以支持项目B,但是可能因为jdk环境不一样带来其它问题, 这个大家只能自己根据项目实际情况去测试
三:使用docker容器, 容器内部指定每个项目的jdk版本,如在项目A指定jdk8 在项目B的容器指定jdk17
参考资料
jdk17编译出兼容jdk8的代码