在尝试了 Arytom 的解决方案但没有成功后,我们尝试调查 joshaidan 的建议。经过进一步挖掘,我们发现了 Oracle 支持文档:2645919.1
来自那篇文章:
原因
应用程序包包含不兼容的 jar 库/类。 WebLogic 内部使用 ASM 库来检查类字节码版本,它有以下类似的代码来检查字节码版本是否兼容,否则将抛出 IllegalArgumentException。
https://github.com/llbit/ow2-asm/blob/master/src/org/objectweb/asm/ClassReader.java
166 public ClassReader(final byte[] b, final int off, final int len) {
167 this.b = b;
168 // checks the class version
169 if (readShort(off + 6) > Opcodes.V1_8) {
170 throw new IllegalArgumentException();
171 }
将类文件版本更新为 53.0
当与 -target 9(显式或隐式指定)一起生成类文件时,javac 将生成主版本号为 53 的类文件。有关版本 53 类文件的详细信息,请参阅 Java 虚拟机规范。
JDK 类本身主要使用 53 版的类文件。
依赖 ASM 或其他字节码操作库的工具或库可能需要这些库的更新版本才能使用 53 版类文件。
解决方案
将问题类/库替换为兼容版本。
[oracle@sandbox ~]$ cd ~/war
[oracle@sandbox war]$ for i in `find . -name '*.jar'`; do unzip -qo $i -d $i.delemete; done
[oracle@sandbox war]$ find . -name \*.class | xargs file | sort -t, -k2 | tail -n 10
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/InvokeTransactionResponse.class: compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/MyClient$1.class: compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/MyClient.class compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/ObjectFactory.class: compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/package-info.class: compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/SimpleClientJwsImpl.class compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/js.jar.delemete/examples/webservices/jaxws/SimpleClientService.class: compiled Java class data, version 52.0 (Java 1.8)
./WEB-INF/lib/jackson-annotations-2.10.2.jar.delemete/module-info.class compiled Java class data, version 53.0
./WEB-INF/lib/jackson-core-2.10.2.jar.delemete/module-info.class: compiled Java class data, version 53.0
./WEB-INF/lib/jackson-databind-2.10.2.jar.delemete/module-info.class: compiled Java class data, version 53.0
在上面的例子中需要注意的是,最后 3 行是 53.0 版 的类文件,它们将是有问题的类。
在对我们的应用进行调查后,我们使用 Spring boot 1.5.6.RELEASE 发现 Jersey 依赖项引入了为 JDK9 编译的 asm-all-repackaged:2.5.0-b32。添加以下显式依赖项解决了该问题,在此处找到了解决方案:https://github.com/jersey/jersey/issues/3617
<!--
Work around bug where Jersey pulls in asm-all-repackaged:2.5.0-b32, which is compiled for JDK9. This prevents deployment to WebLogic 12.1.3 on JDK8
https://github.com/jersey/jersey/issues/3617
Oracle Support Doc ID 2645919.1
-->
<dependency>
<groupId>org.glassfish.hk2.external</groupId>
<artifactId>asm-all-repackaged</artifactId>
<version>2.4.0</version>
</dependency>