A jarhanyalah sebuah wadah. Ini adalah arsip file ā la tar. Meskipun jarmungkin memiliki informasi menarik yang terkandung dalam hierarki META-INF itu, ia tidak memiliki kewajiban untuk menentukan vintage kelas di dalamnya. Untuk itu, seseorang harus memeriksa classfile - file di dalamnya.
Seperti yang disebutkan oleh Peter Lawrey dalam komentar terhadap pertanyaan awal, Anda tidak dapat selalu mengetahui rilis JDK mana yang membangun classfile yang diberikan , tetapi Anda dapat mengetahui versi kelas kode byte dari classfile yang terkandung dalam a jar.
Ya, ini agak menyebalkan, tetapi langkah pertama adalah mengekstraksi satu atau lebih kelas dari jar. Sebagai contoh:
$ jar xf log4j-1.2.15.jar
Di Linux, Mac OS X atau Windows dengan Cygwin terinstal, perintah file (1) tahu versi kelasnya.
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
Atau sebagai alternatif, menggunakan javapdari JDK sebagai @ jikes.thunderbolt dengan tepat menunjukkan:
$ javap -v ./org/apache/log4j/Appender.class | grep major
major version: 45
Dan jika Anda terdegradasi ke Windowslingkungan tanpa salah satu fileataugrep
> javap -v ./org/apache/log4j/Appender.class | findstr major
major version: 45
FWIW, saya akan setuju bahwa javapakan memberi tahu lebih banyak tentang classfile yang diberikan daripada pertanyaan asli yang diajukan.
Bagaimanapun, versi kelas yang berbeda, misalnya:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
Nomor utama versi kelas sesuai dengan versi Java JDK berikut:
- 45.3 = Java 1.1
- 46 = Java 1.2
- 47 = Java 1.3
- 48 = Java 1.4
- 49 = Java 5
- 50 = Java 6
- 51 = Java 7
- 52 = Java 8
- 53 = Java 9