求助:加载FilenameUtils类时出现JVMCFRE003主版本号错误如何解决?
解决JVMCFRE003主版本号错误问题
这个java.lang.UnsupportedClassVersionError: JVMCFRE003 主版本号错误我碰到过好多次,本质上就是编译类文件用的JDK版本,比你当前运行程序的JDK版本高。就你这个情况来说,org/apache/commons/io/FilenameUtils这个类是用更高版本的JDK编译出来的,但你现在用的JVM版本太低,认不出这个类的版本,所以直接报错了。
先一步步排查问题:
- 先搞清楚你当前用啥JDK运行程序:打开终端/命令行,敲
java -version,把输出的版本记下来(比如JDK 1.8、11、17这类)。 - 然后查你用的
commons-io依赖包的版本要求:比如commons-io 2.12.x及以上版本,基本都是用JDK8+编译的,要是你用JDK6跑肯定炸。 - 或者直接看类文件的版本号:用命令
javap -verbose org.apache.commons.io.FilenameUtils | grep "major",输出的主版本号对应JDK版本是这样的:- 52 → JDK8
- 55 → JDK11
- 59 → JDK15
- 以此类推,对比一下你运行时的JDK版本是不是比这个对应版本低。
然后是具体解决办法:
- 升级运行环境的JDK:把你用来跑程序的JDK,换成和编译那个类的JDK版本一致或者更高的。比如类是JDK8编译的,那你就换成JDK8或者更高版本的JDK来运行。
- 降级依赖包版本:要是你没法升级JDK,那就找个和当前运行JDK兼容的
commons-io版本。比如你用JDK7的话,选commons-io 2.6及以下版本就行,这些版本是用低版本JDK编译的。 - 重新编译自己的代码(如果是自己写的类):要是这个
FilenameUtils是你自己写的类,那就用和运行时JDK版本一致的JDK重新编译,编译的时候可以加-target参数指定目标版本,比如javac -target 1.8 YourClass.java,确保编译后的类能在目标JVM上跑。
举个实际例子:假设你运行时用的是JDK7,但是引入的commons-io是2.10.0版本(用JDK8编译的),那要么把JDK升到8,要么把commons-io换成2.6版本(兼容JDK7)。
内容的提问来源于stack exchange,提问作者Jimit Raithatha
相关产品推荐
相关产品推荐

