Определение версии компилятора Java по файлу jar

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения версии javac, использованной при компиляции .jar файла, следует извлечь файлы .class и провести проверку главного номера версии в класс-файле. Для этого можно использовать следующие команды:

shell
Скопировать код
# Распаковываем содержимое jar-файла
unzip my-app.jar -d extracted/

# Анализируем версию класс-файла
javap -verbose extracted/com/myapp/Main.class | grep -m 1 "major"

Главный номер версии указывает на версию Java:

  • 52 соответствует Java 8
  • 55 соответствует Java 11
  • 59 соответствует Java 15

Следует искать только первое упоминание номера версии для определения версии компилятора.

Кинга Идем в IT: пошаговый план для смены профессии

Руководство по изучению байт-кода

С помощью команды javap -verbose вы получите ценную информацию:

  • Версии классов и их совместимость с JVM: Версия класса указывает минимальную версию Java, на которой данный класс будет работать, но не даст точной версии javac.
  • Анализ байт-кода с использованием шестнадцатеричного редактора: Первые 4-7 байт класс-файлов можно анализировать с помощью шестнадцатеричного редактора, если вы готовы к этому.
  • Данные из манифеста: В файлах MANIFEST.MF, находящихся в директории META-INF, может содержаться информация о версии JDK, её можно интерпретировать как послание от компилятора, если вы везучи.
  • Командные утилиты: В Unix существует полезная команда file, пользователи Windows с установленным Cygwin также смогут применить аналогичные инструменты.

Дешифровка главных номеров версий

Хотя главные номера версий вначале кажутся загадочными, они следуют установленному шаблону:

Главный номер версииВерсия Java
506
517
528
......

Информацию о связи между главными номерами версии и версией Java можно найти в официальной документации Java и в статьях на Википедии.

Проверка версии без распаковки jar

При необходимости проверить версию класса без извлечения .jar, можно использовать следующую команду:

shell
Скопировать код
# Используем javap и указываем путь к .jar файлу
javap -cp my-app.jar -verbose com.myapp.Main | grep "major"

Перед использованием подставьте свои данные вместо com.myapp.Main. Этот способ избавляет от необходимости проводить лишние действия.

Инструменты для анализа байт-кода

Существует множество инструментов и библиотек, предназначенных для анализа байт-кода:

  • Apache Commons BCEL: Инструмент для определения версии компилятора javac.
  • Bytecode Viewer: Мультитул для подробного анализа байт-кода.
  • Java Decompiler: Поможет раскрыть тайны файла .jar.

Визуализация

Представьте комнату, наполненную амфорами, которые были созданы с использованием разных версий javac:

Markdown
Скопировать код
Профессор (🎓): "Раскройте ваше происхождение!"

Амфора 1 (🏺1️⃣): "Мой создатель любил загадки."
Амфора 2 (🏺2️⃣): "Ключ к ответу внутри моей структуры."
Амфора 3 (🏺3️⃣): "Перед лицом истинного исследователя я готова раскрыться."

Решение загадки
---------------

Профессор приступает к исследованию каждой амфоры:

plaintext
Скопировать код
🎓: "А, документ! Какой интересный..."
Markdown
Скопировать код
Запись 📄 (🏺1️⃣): Создана на версии: 1.7.0_79
Запись 📄 (🏺2️⃣): Хм, никаких упоминаний о версии
Запись 📄 (🏺3️⃣): Странно, информация о версии так и не обнаружена.

Но профессор не теряет оптимизма и начинает анализировать амфору глубже:

shell
Скопировать код
🎓: "Пришло время расшифровать этот чертеж."
shell
Скопировать код
Чертёж 🖥 (🏺1️⃣): Главный номер: 51
Чертёж 🖥 (🏺2️⃣): Главный номер: 52
Чертёж 🖥 (🏺3️⃣): Главный номер: 58

Анализ чертежей открывает тайну мастеров, создавших амфоры, и подчёркивает важность совместимости в разных средах.

Полезные материалы

  1. Обсуждение на StackOverflow — разговор о версиях JDK, применённых для компиляции.
  2. Формат файлов классов Java — детализированная информация о формате класс-файлов.
  3. Страница на Википедии — история версий Java.
  4. Apache Commons BCEL — библиотека для анализа байт-кода.
  5. javap — командный инструмент для анализа класс-файлов.
  6. Java Decompiler — инструменты для обратной инженерии.
  7. Bytecode Viewer — универсальный комплекс для работы с байт-кодом.