Список основных версий номеров формата файлов классов Java
Я наткнулся на список основных номеров версий Java в одном из постов и хотел бы уточнить его происхождение. Вот как он выглядит:
Java | Major version |
---|---|
23 | 67 |
22 | 66 |
21 | 65 |
20 | 64 |
19 | 63 |
18 | 62 |
17 | 61 |
16 | 60 |
15 | 59 |
14 | 58 |
13 | 57 |
12 | 56 |
11 | 55 |
10 | 54 |
9 | 53 |
8 | 52 |
7 | 51 |
6 | 50 |
5 | 49 |
1.4 | 48 |
1.3 | 47 |
1.2 | 46 |
1.1 | 45 |
1.0.2 | 45 |
Откуда взялся этот список? Есть ли конкретная ссылка на него? Лучше всего, если будет что-то, что показывает также минорные версии?
4 ответ(ов)
Вы можете найти список версий классов Java в формате .class на странице Wikipedia, посвященной формату файлов классов:
http://en.wikipedia.org/wiki/Java_class_file#General_layout
В разделе с байтовыми смещениями 6 и 7 указаны версии, соответствующие конкретным версиям Java VM. Эти данные могут быть полезны, если вы сталкиваетесь с проблемами совместимости или хотите узнать, к какой версии Java относиться ваш .class файл.
Если у вас есть файл класса по пути build/com/foo/Hello.class
, вы можете проверить, на какой версии Java он был скомпилирован, используя следующую команду:
javap -v <путь к файлу класса> | grep "major"
Пример использования:
$ javap -v build/classes/com/example/Book.class | grep major
major version: 57
Согласно таблице в вопросе, версия major 57 означает, что файл класса был скомпилирован до уровня байт-кода JDK 13.
Если вы столкнулись с проблемой "ошибка компиляции классового файла", это можно решить, изменив JRE проекта на соответствующий через Eclipse.
- Перейдите в настройки пути сборки (Build Path).
- Выберите "Настроить путь сборки" (Configure Build Path).
- Измените библиотеку на соответствующую из таблицы, которую показал ваш друг.
- Создайте "jar файл" и скомпилируйте его для выполнения.
Я сделал это, и у меня все заработало.
Вы можете использовать следующий код в вашем .lessfilter
, чтобы получить информацию о версии компиляции классов с помощью javap
, а также для декомпиляции классов:
*.class)
echo "/** "
javap -verbose "$1" | grep version | sed -e 's/50/Java6/' -e 's/51/Java7/' -e 's/52/Java8/' -e 's/53/Java9/' -e 's/54/Java10/' -e 's/55/Java11/' -e 's/56/Java12/' -e 's/57/Java13/'
echo " **/"
java -jar ~/bin/cfr-0.150.jar "$1" | enscript --color --language=ansi --highlight=java -o - -q
;;
Данный скрипт сначала выводит строку с комментариями, содержащими информацию о версии Java, с помощью команды javap -verbose
. Вместо числового обозначения версии, он отображает соответствующее значение (например, "Java6", "Java7" и так далее), заменяя коды версий с помощью sed
. После этого он использует инструмент CFR
для декомпиляции класса и выводит результат с подсветкой синтаксиса с помощью enscript
.
Если у вас есть дополнительные вопросы или нужна помощь, дайте знать!
Инициализация ArrayList в одну строчку
Что значит "Не удалось найти или загрузить основной класс"?
Что значит 'synchronized'?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Eclipse/Java: не работает автозавершение кода