Jar-файл и java.exe
От: Mihal9  
Дата: 12.03.24 09:31
Оценка:
Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?
Re: Jar-файл и java.exe
От: scf  
Дата: 12.03.24 10:24
Оценка:
Здравствуйте, Mihal9, Вы писали:

M>Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?


Да, можно. в .class файле есть версия формата, а по версии формата можно определить минимальную версию JDK
Re: Jar-файл и java.exe
От: · Великобритания  
Дата: 12.03.24 10:34
Оценка:
Здравствуйте, Mihal9, Вы писали:

M> Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?

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

А в общем случае никак. Jar — это тупо зип-файл с кучей .class-файлов. Как правило они скомпилены одной версией компилятора. Можно заглянуть в META-INF/MANIFEST.MF, там может быть Build-Jdk.
С другой стороны, компилятор может компилять с другим target. Т.е. jdk17 может сгенерить классы, работающие на jdk8
Разные классы могут быть скомпилены разными версиями (например у тебя может быть uber-jar — перепакованный архив из множества разных jar-ок).
Т.е. в общем случае надо пройтись по всем .class файлам и проверить у них class version — это 6й-7й байты.
А ещё теоретически может быть рантайм-кодогенерация...
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Jar-файл и java.exe
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 06.07.24 03:54
Оценка:
Здравствуйте, Mihal9, Вы писали:

M>Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?


В корректном JAR файле версия JDK должна определяться в файле манифеста META-INF/MANIFEST.MF, параметр Build-Jdk-Spec.

Если он отсутствует — распаковать архив и вызывать javap -verbose для .class файла, он покажет, на какой версии JDK собиралось. Либо в HEX просмотрщике открыть .class файл, после сигнатуры CAFEBABE по смещению 4 расположена minor версия, а потом по смещению 6 — major версия (оба поля 2 байта в Big Endian).
JDK Major version Major version (HEX)
1.1 45 2D
1.2 46 2E
1.3 47 2F
1.4 48 30
5.0 49 31
6.0 50 32
7 51 33
8 52 34
9 53 35
10 54 36
11 55 37
12 56 38
13 57 39
14 58 3A
15 59 3B
16 60 3C
17 61 3D
18 62 3E
19 63 3F
20 64 40
21 65 41
22 66 42
23 67 43
24 68 44
— Нет в мире справедливости, — простонал Билл, когда цепкие пальцы Смертвича впились в его плечо.
— Конечно, нет, — согласился Смертвич. — А ты как думал?
Re[2]: Jar-файл и java.exe
От: Worminator X Россия #StandWithPalestine 🖤🤍💚
Дата: 06.07.24 04:01
Оценка: -1
Здравствуйте, ·, Вы писали:

·>А в общем случае никак. Jar — это тупо зип-файл с кучей .class-файлов.


Он должен следовать определенным правилам, в частности иметь правильно прописанный манифест — с Main-Class (если это приложение, а не библиотека), Manifest-Version, Build-Jdk-Spec и Class-Path (если есть зависимости).
— Нет в мире справедливости, — простонал Билл, когда цепкие пальцы Смертвича впились в его плечо.
— Конечно, нет, — согласился Смертвич. — А ты как думал?
Re[2]: Jar-файл и java.exe
От: Infernal Россия  
Дата: 15.07.24 13:28
Оценка:
Здравствуйте, Worminator X, Вы писали:

WX>Здравствуйте, Mihal9, Вы писали:


M>>Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?


WX>В корректном JAR файле версия JDK должна определяться в файле манифеста META-INF/MANIFEST.MF, параметр Build-Jdk-Spec.


WX>Если он отсутствует — распаковать архив и вызывать javap -verbose для .class файла, он покажет, на какой версии JDK собиралось.


с 5го байта в class file

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

u2 minor_version;
u2 major_version;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.