Что означает "Unsupported major.minor version 52.0" и как его исправить?

Хорошо, поэтому я понимаю, что 52.0 - это Java 8, и что исключения означают, что некоторый код скомпилирован с одной версией java, а некоторые с другой. То, что я не могу опустить, - это то, что вокруг.

Вот трассировка стека, которую я получаю:

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, и он падает до достижения основного. Я следил за несколькими сообщениями здесь, говоря, чтобы изменить уровень соответствия/мою JRE, но я не могу заставить его исправить.

Является ли ошибка, указывающая, что класс 'ValueFactory' был скомпилирован с помощью java 8 или у моего кода? Я попытался изменить уровень соответствия 1.6, 1.7 и 1.8, но ни одна из них не устранила проблему.

Ответ 1

Вам не нужно менять уровень соответствия здесь, или, скорее, вы должны, но это не проблема.

Соответствие кода гарантирует, что ваш код совместим с данной версией Java.

Например, если у вас есть таргетинг на соответствие требованиям Java 6, вы не можете использовать Java 7 или 8 новых синтаксических функций (например, алмаз, лямбда и т.д.).

Настоящая проблема заключается в том, что вы пытаетесь скомпилировать что-то в версии Java, которая отличается от зависимостей проекта от пути к классам.

Вместо этого вы должны проверить JDK/JRE, который вы используете для сборки.

В Eclipse откройте свойства проекта и проверьте выбранную JRE в пути сборки Java.

Если вы используете пользовательские скрипты Ant (и т.д.), вы также хотите посмотреть там, в случае, если выше этого недостаточно.

Ответ 2

Ваш код был скомпилирован с помощью Java 8.

Скомпилируйте свой код со старым JDK (уровень соответствия) или запустите его на Java 8 JRE.

Надеюсь, что это поможет...

Ответ 3

На самом деле у вас есть код, скомпилированный с таргетингом на более высокий JDK (JDK 1.8 в вашем случае), но во время выполнения вы поставляете более низкую JRE (JRE 7 или ниже).

вы можете исправить эту проблему, добавив целевой параметр во время компиляции
например если ваша цель выполнения равна 1.7, вы должны использовать 1.7 или ниже

javac -target 1.7 *.java

если вы используете eclipse, вы можете отправить этот параметр в Окно → Настройки → Java → Компилятор → установите "Уровень соответствия компилятора" = выберите версию runtime jre или ниже.