问题描述
运行好好的项目,没有做任何改动,最近在编译时报以下错误
java.lang.UnsupportedClassVersionError: org/eclipse/jface/text/Document has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
大概意思是org.eclipse.jface.text.Document是Java17编译的,而当前运行环境是Java11,这就奇怪了,工程的POM依赖也没变过,自己也没使用过Java17,怎么会引入Java17的类。
问题排查
首先找到这个jar包被依赖的地方
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.29.0</version>
</dependency>
再进去org.eclipse.jdt.core的pom查看,发现了org.eclipse.text的依赖版本是从 >= 3.6.0, < 4.0.0
之间的一个最新版本
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.resources</artifactId>
<version>[3.14.0,4.0.0)</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.runtime</artifactId>
<version>[3.13.0,4.0.0)</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.filesystem</artifactId>
<version>[1.7.0,2.0.0)</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.text</artifactId>
<version>[3.6.0,4.0.0)</version>
</dependency>
再到本地的Maven仓找一下这个jar包,此时最新的是3.13.0,具体路径如下:
\org\eclipse\platform\org.eclipse.text\3.13.0\org.eclipse.text-3.13.0.jar
用解压工具打开这个jar包,查看\META-INF\MANIFEST.MF文件,发现确实是Java17编译的
然后,官网也打开看了下,确实最近的版本已经是基于Java17的了
问题解决
知道了这个原因,可以把限使用Java11的最新版本的eclipse相关组件
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>${eclipse-jdt-core.version}</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.platform</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.resources</artifactId>
<version>3.18.200</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.runtime</artifactId>
<version>3.26.100</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.core.filesystem</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.text</artifactId>
<version>3.12.300</version>
</dependency>
最后
感觉如果换JDK这么大改动的话,起码版本要升一个高一点的吧,比如4.x, 或者不要使用版本范围。这么搞一下,有点不厚道啊。