1. Overview
In this tutorial, we'll look at how to find the Java release version for a .class file. Additionally, we'll look at how to check the Java version in jar files.
2. .class Version in Java
When a Java file is compiled, a .class file is generated. In some cases, we need to find the Java release version of the compiled class file. Each Java major release assigns a major version for the .class file it generates.
In this table, we map the major version number of .class to the version of the JDK where that class version was introduced, and we show the hexadecimal representation of that version number:
Java Release |
Class Major Version |
Hex |
Java SE 18 |
62 |
003e |
Java SE 17 |
61 |
003d |
Java SE 16 |
60 |
003c |
Java SE 15 |
59 |
003b |
Java SE 14 |
58 |
003a |
Java SE 13 |
57 |
0039 |
Java SE 12 |
56 |
0038 |
Java SE 11 |
55 |
0037 |
Java SE 10 |
54 |
0036 |
Java SE 9 |
53 |
0035 |
Java SE 8 |
52 |
0034 |
Java SE 7 |
51 |
0033 |
Java SE 6 |
50 |
0032 |
Java SE 5 |
49 |
0031 |
JDK 1.4 |
48 |
0030 |
JDK 1.3 |
47 |
002f |
JDK 1.2 |
46 |
002e |
JDK 1.1 |
45 |
002d |
3. javap Command for .class Version
Let's create a simple class and build it with JDK 8:
public class Sample {
public static void main(String[] args) {
System.out.println("Baeldung tutorials");
}
}
In order to identify the version of the class file, we can use the Java class file disassembler javap.
Here's the syntax for the javap command:
javap [option] [classname]
Let's check the version for Sample.class as an example:
javap -verbose Sample
//stripped output ..
..
..
Compiled from "Sample.java"
public class test.Sample
minor version: 0
major version: 52
..
..
As we can see in the output of the javap command, the major version is 52, indicating that it's for JDK8.
While javap gives many details, we're only concerned with the major version.
For any Linux-based system, we can use the following command to obtain only the major version:
javap -verbose Sample | grep major
Similarly, for a Windows system, here's the command we can use:
javap -verbose Sample | findstr major
This gives us the major version, 52, in our example.
It's important to note that this version value doesn't indicate that the application was built with the corresponding JDK. A class file version can be different from the JDK used for compilation.
For example, if we build our code with JDK11, it should produce a .class file that has version 55. But, if we pass -target 8 during compilation, then the .class file will have version 52.
4. hexdump for .class Version
It's also possible to check the version using any hex editor. Java class file follows a specification. Let's look at its structure:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
// other details
}
Here, the types u1, u2, and u4 represent an unsigned one, two, and four-byte integer, respectively.
The u4 is a magic number identifying the class file format. It has the value 0xCAFEBABE, and the u2 is the major version.
For a Linux-based system, we can use the hexdump utility to parse any .class file:
> hexdump -v Sample.class
0000000 ca fe ba be 00 00 00 34 00 22 07 00 02 01 00 0b
0000010 74 65 73 74 2f 53 61 6d 70 6c 65 07 00 04 01 00
...truncated
In this example, we compiled using JDK8. The 7 and 8 indexes in the first line provide the major version of the class file. Therefore, 0034 is the hex representation, and JDK8 is the corresponding release number (from the mapping table we saw earlier).
As an alternative, we can directly get the major release version as a decimal with hexdump:
> hexdump -s 7 -n 1 -e '"%d"' Sample.class
52
Here, output 52 is the class version that corresponds to JDK8.
5. Version for jars
A jar file in the Java ecosystem consists of a collection of class files bundled together. In order to find out which Java version the jars are built or compiled, we can extract the jar file and use either javap or hexdump to check the .class file versions.
There is also a MANIFEST.MF file in the jar file, which contains some header information about the JDK used.
For example, the Build-Jdk or Created-By header stores the JDK value depending on how the jar is built:
Build-Jdk: 17.0.4
or
Created-By: 17.0.4
5. Conclusion
In this article, we learned how to find the Java version for a .class file. We saw the javap and hexdump commands and their usage for finding the version. Additionally, we looked at how to check the Java version in jar files.
res – REST with Spring (eBook) (everywhere)