问题描述
项目此次版本改动内容并不复杂,并上线部署正常,但是调用某接口时报错,报错内容意思是:org/apache/tika/mime/由java11编译,但是运行在1.8的版本上。
报错内容
nested exception is java.lang.UnsupportedClassVersionError: org/apache/tika/mime/MimeTypeException has been
compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime
only recognizes class file versions up to 52.0
原因分析:
发现报错的这个类
org/apache/tika/mime/MimeTypeException
在合作方SDK中引用到,正好是请求合作方接口时报的错,那么问题基本可以定位到是合作方SDK引用到了使用java11编译导致的报错,接下来进行排查
- 找到
MimeTypeException
异常类,发现位于java11中
- 查看引用,发现是合作方sdk中的一个工具类引用到了
public static String getFileExt(InputStream stream) {
String fileExt = ".bin";
try {
String mimeType = getMimeType(stream);
fileExt = TikaConfig.getDefaultConfig().getMimeRepository().getRegisteredMimeType(mimeType).getExtension();
} catch (MimeTypeException e) {
e.printStackTrace();
}
return fileExt;
}
那可就确定是合作方SDK的问题了,但是,这块代码没有改过,原先就在这里,为什么会在此次部署后请求报错
- 找到
MimeTypeException
类所在的包,发现依赖的是tika-core 3.0.0,并可以看到由java11编译
- 那么就是合作方sdk中更新了
org.apache.tika
导致的,找到合作方的sdk查看依赖吗,发现是这么定义的
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika-core.version}</version>
</dependency>
<properties>
<tika-core.version>[1.22,)</tika-core.version>
</properties>
- 不知道为什么突然就被引用到了3.0,手动改为1.22问题就解决了
解决方案:
在pom文件中忽略指定
tika-core
,重新引入1.22问题解决
这里的的合作方信息我用xxx代替了
<dependency>
<groupId>xxxx</groupId>
<artifactId>xxxx-sdk</artifactId>
<version>xxxx</version>
<exclusions>
<exclusion>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.22</version>
</dependency>