关于java:’不支持的major.minor版本52.0’是什么意思,我该如何解决?

What does 'Unsupported major.minor version 52.0' mean, and how do I fix it?

本问题已经有最佳答案,请猛点这里访问。

OK,所以我松散地理解52是Java 8,并且异常意味着一些代码是用Java的一个版本编译的,有些则是用另一个版本编译的。我脑子里想不出来的是它的方向。

下面是我得到的堆栈跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Exception in thread"main" java.lang.UnsupportedClassVersionError: org/openrdf/model/ValueFactory : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
    at java.lang.Class.getMethod0(Class.java:2856)
    at java.lang.Class.getMethod(Class.java:1668)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)

我正在执行Eclipse中的代码,它在到达main之前崩溃了。我在这里跟踪了几篇文章,说要更改我的遵从性级别/JRE,但我似乎无法修复它。

错误是说类"ValueFi工厂"是用Java 8编译的,还是我的代码已经编译过?我尝试将我的遵从性级别更改为1.6、1.7和1.8,但这两个级别都没有解决问题。


您不需要在这里更改合规性级别,或者更确切地说,您应该更改,但这不是问题所在。

代码遵从性确保您的代码与给定的Java版本兼容。

例如,如果你有一个针对Java 6的代码遵从性,你就不能使用Java 7或8的新语法特征(例如,菱形、lambdas等)。

这里的实际问题是,您试图在Java版本中编译看起来与类路径中的项目依赖性不同的东西。

相反,您应该检查您用来构建的JDK/JRE。

在Eclipse中,打开项目属性并在Java构建路径中检查选定的JRE。

如果您使用的是定制的Ant(等)脚本,那么您还需要看一看,以防上述内容本身不够。


您的代码是用Java 8编译的。

要么用旧的JDK(遵从级别)编译代码,要么在Java 8 JRE上运行它。

希望这有帮助…


实际上,您有一个针对更高的JDK(在您的例子中是JDK 1.8)编译的代码,但是在运行时,您提供的是较低的JRE(JRE 7或更低)。

可以通过在编译时添加目标参数来解决此问题。例如,如果运行时目标是1.7,则应使用1.7或更低版本。

1
javac -target 1.7 *.java

如果您使用Eclipse,可以在窗口>首选项> java>编译器> >设置"编译器遵从级别"=选择运行时JRE版本或更低。