What version of javac built my jar?
A jar
is merely a container. It is a file archive ā la tar
or zip
. While a jar
may have interesting information contained within it's META-INF hierarchy, it has no obligation to specify the vintage of the classes within its contents. For that, one must examine the class
files therein.
As as Peter Lawrey mentioned in comment to the original question, you can't necessarily know which JDK release built a given class
file, but you can find out the byte code class version of the class
file contained in a jar
.
Yes, this kinda sucks, but the first step is to extract one or more classes from the jar
. For example:
$ jar xf log4j-1.2.15.jar
On Linux, Mac OS X or Windows with Cygwin installed, the file(1) command knows the class version.
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
Or alternatively, using javap
from the JDK as @jikes.thunderbolt aptly points out:
$ javap -v ./org/apache/log4j/Appender.class | grep major
major version: 45
For Windows
environments without either file
or grep
> javap -v ./org/apache/log4j/Appender.class | findstr major
major version: 45
FWIW, I will concur that javap
will tell a whole lot more about a given class
file than the original question asked.
Anyway, a different class version, for example:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
The list below shows the class version major number and JDK version where that class major version was introduced.
Note: class version does not necessarily identify the JDK used to compile the class - it only identifies the earliest version which may have produced it.
For example, class major version 52 could have been produced by any JDK after Java 7.
- 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
- 54 = Java 10
- 55 = Java 11
- 56 = Java 12
- 57 = Java 13
- 58 = Java 14
- 59 = Java 15
- 60 = Java 16
- 61 = Java 17
- 62 = Java 18
- 63 = Java 19
You can't tell from the JAR file itself, necessarily.
Download a hex editor and open one of the class files inside the JAR and look at byte offsets 4 through 7. The version information is built in.
http://en.wikipedia.org/wiki/Java_class_file
Note: As mentioned in the comment below,
those bytes tell you what version the class has been compiled FOR, not what version compiled it.
Here is Java's way to find this information.
Windows: javap -v <class> | findstr major
Unix: javap -v <class> | grep major
For example:
> javap -v Application | findstr major
major version: 51