Здравствуйте, ·, Вы писали:
·>А в общем случае никак. Jar — это тупо зип-файл с кучей .class-файлов.
Он должен следовать определенным правилам, в частности иметь правильно прописанный манифест — с Main-Class (если это приложение, а не библиотека), Manifest-Version, Build-Jdk-Spec и Class-Path (если есть зависимости).
— Нет в мире справедливости, — простонал Билл, когда цепкие пальцы Смертвича впились в его плечо.
— Конечно, нет, — согласился Смертвич. — А ты как думал?
Здравствуйте, 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й байты.
А ещё теоретически может быть рантайм-кодогенерация...
Здравствуйте, 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
— Нет в мире справедливости, — простонал Билл, когда цепкие пальцы Смертвича впились в его плечо.
— Конечно, нет, — согласился Смертвич. — А ты как думал?
Здравствуйте, Worminator X, Вы писали:
WX>Здравствуйте, Mihal9, Вы писали:
M>>Можно ли как-то по содержимому jar-файла определить, с какой версией JDK он работает?
WX>В корректном JAR файле версия JDK должна определяться в файле манифеста META-INF/MANIFEST.MF, параметр Build-Jdk-Spec.
WX>Если он отсутствует — распаковать архив и вызывать javap -verbose для .class файла, он покажет, на какой версии JDK собиралось.