Java:JVMCFRE003 错误的主要版本; class=org/apache/commons/io/FilenameUtils, 偏移量=6

Java: JVMCFRE003 bad major version; class=org/apache/commons/io/FilenameUtils, offset=6

这是完整的错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: JVMCFRE003 bad major version; class=org/apache/commons/io/FilenameUtils, offset=6
    at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:69)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:540)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:451)
    at java.net.URLClassLoader.access0(URLClassLoader.java:79)
    at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:1038)
    at java.security.AccessController.doPrivileged(AccessController.java:284)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:429)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:660)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:358)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
......

我知道这是一个很常见的错误,但如果不花费至少 72 小时尝试解决我的问题,我不会 post 在这里提出问题 :)。我知道为什么会出现此错误(我只是通过使用正确的字节码版本进行编译来修复了其中的一些错误),但这是我无法摆脱的最后一个问题。所以我的 Java 版本如下(是的,我知道,旧的,但组织限制......:p)。

java version "1.6.0"
Java(TM) SE Runtime Environment (build pap6460sr9fp2-20110627_03(SR9 FP2))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460sr9-
20110624_85526 (JIT enabled, AOT enabled)
J9VM - 20110624_085526
JIT  - r9_20101028_17488ifx17
GC   - 20101027_AA)
JCL  - 20110530_01

令人惊讶的是,即使使用与 JDK 1.5!

兼容的 FileNameUtils 2.2,我也会收到此错误

我正在使用 IntelliJ 进行编译。这些是我将目标字节码版本设置为 1.5 的地方:

  1. 文件 -> 项目结构 -> 模块 :: 源(路径和依赖项旁边)--> 语言级别 5
  2. 文件 -> 设置 -> 构建、执行、部署 -> 编译器 -> Java 编译器 -> 项目字节码版本:1.5
  3. 项目 iml 文件 - JDK 1_5
  4. Maven 编译器版本 - 1.5

我完全无法理解为什么当我的字节码版本比运行代码的 1.6 低一个级别时,FileNameUtils 2.2(甚至 1.6)会抛出严重的主要版本错误。

我也尝试过构建、重建和重新导入 Maven 依赖项!我希望有人能帮我解决这个问题。

以下是对我有用的方法。我在 IntelliJ 中的工件配置仍在提取我之前使用过的较新的依赖项版本。我意识到我需要降级某些依赖项的版本,所以我更新了 pom.xml。不知何故,工件在编译时没有更新的依赖版本。

这次我从我的 IntelliJ 配置中删除了现有的工件并执行了一个 Maven 目标。这有助于提取所有依赖项的正确版本。