1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал [Туториал] Как решить ошибку UnsupportedClassVersionError

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем Dymeth, 12 янв 2024.

  1. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Крайне популярная ошибка, решение которой люди либо не могут нагуглить, либо не могут понять.
    Объясняю.

    Из-за чего возникает ошибка?

    Для начала переведём:
    Простыми словами, ошибка заключается в том, что плагин был создан под более новую версию Java, чем установлена у вас на сервере. Таким образом, ваша Java неспособна загрузить и выполнить код плагина.

    Чтобы понять, какая версия Java вам нужна, обратим внимание на ПЕРВОЕ_ЧИСЛО. Именно оно подскажет, под какую версию Java был разработан плагин.

    Каждая версия класса соответствует определённой версии Java, определить можно по таблице:
    На самом деле, таблица даже не нужна. Самые сообразительные поймут, что для определения версии Java достаточно просто отнять от версии класса число 44. Например, class version 52 - 44 = 8 Java.

    Тем не менее, вот список:
    Java 1.0 45.0
    Java 1.1 45.3
    Java 1.2 46.0
    Java 1.3 47.0
    Java 1.4 48.0
    Java 5 49.0
    Java 6 50.0
    Java 7 51.0
    Java 8 52.0
    Java 9 53.0
    Java 10 54.0
    Java 11 55.0
    Java 12 56.0
    Java 13 57.0
    Java 14 58.0
    Java 15 59.0
    Java 16 60.0
    Java 17 61.0
    Java 18 62.0
    Java 19 63.0
    Java 20 64.0
    Java 21 65.0
    Java 22 66.0
    Java 23 67.0

    Более новые версии можно найти, например, тут: https://javaalmanac.io/bytecode/versions/

    А вот взглянув на ВТОРОЕ_ЧИСЛО можно легко понять, какая версия Java у вас установлена прямо сейчас. Делается это по той же самой таблице под спойлером.

    Рассмотрим пример:
    Из данной ошибки сразу понятно, что плагину требуется Java 11, но у ваш сервер запущен с Java 8.

    Всегда, когда ваша версия Java ниже версии Java плагина, то возникает ошибка. Если ваша версия Java совпадает или выше (новее) версии Java плагина, то в большинстве случаев будет работать нормально.

    Например, если для плагина требуется Java 8, а у вас будет Java 11, то проблем не возникнет.

    Как решить эту проблему?

    У вас три решения:

    Вы можете использовать для запуска сервера более новую версию Java. В большинстве случаев это самый простой и универсальный способ решить проблему.
    Вам необязательно использовать ровно ту, что требуется для плагина. Можно и более новую.

    Лично я рекомендую использовать LTS-версии Java. Это версии, для которых заявлена длительная поддержка разработчиков. LTS - Long Term Support - как раз и переводится как "долгосрочная поддержка".
    Также добавлю, что чем новее версия - тем она функциональней и, как правило, производительней. Поэтому если есть возможность ставить наиболее новую LTS версию Java - лучше устанавливать её.
    Список LTS-версий Java с датами их поддержки можно найти тут:
    https://en.wikipedia.org/wiki/Java_version_history#Release_table

    При запуске сервера на более новой версии Java вы можете столкнуться с ошибкой:
    Это происходит из-за того, что ваша версия Java выше той, которую официально поддерживает ядро. Так, например, Paper рекомендует запускать своё ядро на следующих версиях:
    1.8 to 1.11 Java 8
    1.12 to 1.16.4 Java 11
    1.16.5 Java 16
    1.17.1-1.18.1+ Java 21

    Тем не менее, ничего не мешает вам попытаться запустить ядро на более новой версии. Опять же, в большинстве случаев это сработает без проблем. Чтобы отключить предупреждение ядра и разрешить ему запуск на неподдерживаемой версии - необходимо добавить аргумент в скрипт запуска.
    Перед -jar пропишите:
    -DPaper.IgnoreJavaVersion=true

    После этого вы сможете спокойно запускать свои ядра на наиболее новых версиях Java. Таким образом вы не только сможете запускать и все современные плагины, но ещё и получите небольшой прирост производительности за счёт использования наиболее современных технологий в Java.

    Вы можете использовать более старую версию плагина, для которой требуется более старая версия Java. Как найти подходящую версию? Заходите в список обновлений плагина и при помощи CTRL+F ищете упоминание слова "Java". Рано или поздно вы наткнётесь на информацию о том, что плагин был обновлён на более новую версию Java. Соответственно, на предыдущей версии плагин использовал более старую версию Java.
    Но, к сожалению, у некоторых современных плагинов никогда не было поддержки старых версий Java (и, скорее всего, уже никогда не будет). В этом основной недостаток этого способа.

    Этот способ очень хорошо подойдёт разработчикам или людям, которые готовы заказать эту работу у программистов за денежку.
    Задача состоит в том, чтобы найти исходный код нужного плагина или декомпилировать его, после чего произвести модификацию таким образом, чтобы плагин мог запускаться на более старой версии Java.
    Минус способа в том, что вам потребуется либо потратить собственное время, либо финансы на заказ работы у другого человека.

    Какой способ выбирать - решайте сами.
    Постарался максимально подробно рассказать о проблеме, но если остались вопросы - задавайте в комментариях
     
    Последнее редактирование: 12 янв 2024
  2. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Резерв
     
  3. SlenderMix

    SlenderMix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    HIDDEN
    Я бы поспорил с этим выводом, ведь разное бывает, некоторые методы которые раньше работали одним образом, на новых билдах могут быть вовсе переписанные, что повлечет за собой разнообразные сбои, или вовсе приведет к неработоспособности его.
     
  4. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Соглашусь, надо бы статейку дополнить малость. Редкость конечно, но привет рефлексия, и всё ломается.

    А так - спасибо за статейку, будет куда посылать. Сам начинал писать подобную, только с ответами на самые популярные вопросы в целом. Теперь думаю, что и правда стоит разбить на отдельные, чтоб больше информации по случаям вкинуть.
     
  5. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Нет, такого быть не может - в этом плане у Java полная обратная совместимость. Все старые методы называются точно так же, параметры и возвращаемые значения на всех версиях абсолютно одинаковые.

    Но да, с обратной совместимостью есть некоторые проблемы, но они затрагивают буквально 5% плагинов. Именно поэтому я и написал:
    Все проблемы обратной совместимости можно пересчитать по пальцам:
    - разделение ядра на отдельные модули
    - ограничение части рефлексии
    - удаление SecurityManager'а

    Но опять же, нужно держать в голове, что если плагин не поддерживает новые версии Java - вероятнее всего, он заброшен. Поэтому использовать подобные плагины я не рекомендую.

    Я не особо понимаю, что конкретно я могу дополнить по этой теме таким образом, чтобы это было понятно новичкам.
    В теории можно упомянуть конкретные проблемы обратной совместимости и пихнуть их под спойлер конкретно для разработчиков. Но тема всё же не для них
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Я скорей как раз про часть для юзеров, а не разработчиков:
    В плагинах, волей не волей, встречается, и даже всплывало тут пару раз (или на SpigotMC... не вспомню точно)
     

Поделиться этой страницей