How to Check the JDK Version Used to Compile a .class File

Nov 20, 2025 · Programming · 15 views · 7.8

Keywords: Java version check | javap tool | class file compatibility | JDK compilation version | version number mapping

Abstract: This technical article provides a comprehensive guide on identifying the JDK version used to compile Java .class files, particularly when troubleshooting "Bad version number in .class file" errors. It details the use of the javap command-line tool with grep on Unix/Linux systems and findstr on Windows to extract major version information. The article includes a complete mapping table of Java versions to major version numbers from JDK 1.1 to Java 21. Through practical examples and analysis of common compatibility issues, it offers solutions for ensuring consistent compilation and runtime environments in Java development.

Problem Background and Error Analysis

Java developers frequently encounter the "Bad version number in .class file" runtime error, which typically occurs when a lower version Java Runtime Environment (JRE) attempts to execute class files compiled with a higher version JDK. For instance, using JRE 1.5 to run classes compiled for JDK 1.6 triggers such compatibility issues, disrupting application functionality.

Using javap Tool for Version Inspection

The Java Development Kit (JDK) includes the javap tool, which disassembles class files and displays detailed version information. The procedure involves the following steps:

Unix/Linux System Command

javap -verbose MyClass | grep "major"

This command outputs comprehensive class file details and filters lines containing "major" using grep, quickly identifying the major version number.

Windows System Command

javap -verbose MyClass | findstr "major"

On Windows systems, the findstr command serves the same purpose, extracting the major version information from the class file.

Detailed Version Number Correspondence

The major version field in Java class files has a strict correspondence with specific Java versions. Below is the complete version mapping table:

<table border="1"> <tr><th>Java Version</th><th>Major Version</th></tr> <tr><td>1.2</td><td>46</td></tr> <tr><td>1.3</td><td>47</td></tr> <tr><td>1.4</td><td>48</td></tr> <tr><td>5</td><td>49</td></tr> <tr><td>6</td><td>50</td></tr> <tr><td>7</td><td>51</td></tr> <tr><td>8</td><td>52</td></tr> <tr><td>9</td><td>53</td></tr> <tr><td>10</td><td>54</td></tr> <tr><td>11</td><td>55</td></tr> <tr><td>12</td><td>56</td></tr> <tr><td>13</td><td>57</td></tr> <tr><td>14</td><td>58</td></tr> <tr><td>15</td><td>59</td></tr> <tr><td>16</td><td>60</td></tr> <tr><td>17</td><td>61</td></tr> <tr><td>18</td><td>62</td></tr> <tr><td>19</td><td>63</td></tr> <tr><td>20</td><td>64</td></tr> <tr><td>21</td><td>65</td></tr>

Practical Case Study

In real-world development, version mismatch issues can manifest as various runtime errors. For example, one developer reported a java.lang.NoSuchMethodError: java.nio.ByteBuffer.rewind()Ljava/nio/ByteBuffer; error. Investigation revealed that although the code was compiled for Java 6 target version, JDK 9 was actually used for compilation, leading to compatibility problems.

By employing the javap -v [class file path] command, the complete version information output can be examined:

public class ...
minor version: 0
major version: 50
flags: ACC_PUBLIC, ACC_SUPER

Here, the major version is 50, corresponding to Java SE 6.0. The resolution involved downgrading the compilation JDK to JDK 8, ensuring alignment between the compilation and target runtime environments.

Best Practices Recommendations

To prevent version compatibility issues, developers should explicitly specify the target Java version in project configurations. In Maven projects, this can be achieved by configuring the maven-compiler-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

In IDEs like Eclipse, it is crucial to ensure that compiler compatibility options in project settings match the actual deployment environment.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.