A jarè semplicemente un contenitore. È un archivio di file tar. Mentre a jarpuò contenere informazioni interessanti contenute nella sua gerarchia META-INF , non ha l'obbligo di specificare la vendemmia delle classi all'interno dei suoi contenuti. Per questo, è necessario esaminare i classfile in essa contenuti.
Come ha detto Peter Lawrey nel commento alla domanda originale, non puoi necessariamente sapere quale versione di JDK ha creato un determinato classfile, ma puoi scoprire la versione della classe di codice byte del classfile contenuta in a jar.
Sì, questo fa schifo, ma il primo passo è estrarre una o più classi dal file jar. Per esempio:
$ jar xf log4j-1.2.15.jar
Su Linux, Mac OS X o Windows con Cygwin installato, il comando file (1) conosce la versione della classe.
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
O in alternativa, usando javapdal JDK come @ jikes.thunderbolt sottolinea giustamente:
$ javap -v ./org/apache/log4j/Appender.class | grep major
major version: 45
E se sei relegato in un Windowsambiente senza fileogrep
> javap -v ./org/apache/log4j/Appender.class | findstr major
major version: 45
FWIW, concorderò che javapdirà molto di più su un determinato classfile rispetto alla domanda originale.
Ad ogni modo, una versione di classe diversa, ad esempio:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
Il numero maggiore della versione della classe corrisponde alle seguenti versioni JDK di Java:
- 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