- How to check the java compiler version from a java class file?
- About Krishna Srinivasan
- Java version from code
- Version numbers
- Version strings
- Method Summary
- Methods declared in class java.lang.Object
- Method Detail
- parse
- feature
- interim
- update
- patch
- major
- minor
- security
- version
- pre
- build
- optional
- compareTo
- compareToIgnoreOptional
- toString
- equals
- equalsIgnoreOptional
- hashCode
How to check the java compiler version from a java class file?
This tutorial provides a great way to find Java compiler version for a class file generated. It is one of the common problem among Java developers to know the exact version in which the JAR file is created. If you receive a JAR file, can you find what is the target compiler version for that JAR file to be deployed?. If developer not aware of the details, it is difficult for them to test the compatibility issues. If the run the code with different version, runtime exception will be thrown. Before start reading this article, If you want to understand the basics of Java compiler and JVM architecture, please go through the articles Java Compiler API, JVM, JRE and JDK difference and JVM.
java.lang.UnsupportedClassVersionError: test class : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source)
Without knowing the Java version in which the JAR is created is difficult for the developers. There is no way to check the version in the JAR file itself. We can check the version details only using the class files inside the JAR file. Unzip the JAR and take out any one class file to be verified.
- JDK 1.0 — major version 45 and minor version 3
- DK 1.1 — major version 45 and minor version 3
- JDK 1.2 — major version 46 and minor version 0
- JDK 1.3 — major version 47 and minor version 0
- JDK 1.4 — major version 48 and minor version 0
- JDK 1.5 — major version 49 and minor version 0
- JDK 1.6 — major version 50 and minor version 0
- JDK 1.7 — major version 51 and minor version 0
These version could be different for each implementation of the compiler. The above details are specific to Oracle/Sun JDK. JDK has javap command to find the version details.
You will find the following details displayed on the screen.
javapThere is simple program which can get you the Java version details. Run the below program by passing the class file name as the arguments, this would return you the major version details.
package com; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.IOException; public class GetVersion < public static void main(String[] args) throws IOException < System.out.println(getVersionDetails(args[0])); >public static String getVersionDetails(String filename) throws IOException < String version = ""; DataInputStream stream = new DataInputStream(new FileInputStream(filename)); int magicBytes = stream.readInt(); if (magicBytes != 0xcafebabe) < System.out.println(filename + " is not a valid java file!"); >else < int minorVersion = stream.readUnsignedShort(); int majorVersion = stream.readUnsignedShort(); version = majorVersion + "." + minorVersion; >stream.close(); return version; > >
javap command returns the complete details of the bytecode. In that there is major version and minor version which is for identifying the Java version details. I hope this tutorial have provided nice tip on finding the version details for the Java class. If you have any more tips, please contact us, we will publish it in our website.
Reference Books:
About Krishna Srinivasan
He is Founder and Chief Editor of JavaBeat. He has more than 8+ years of experience on developing Web applications. He writes about Spring, DOJO, JSF, Hibernate and many other emerging technologies in this blog.
Java version from code
A representation of a version string for an implementation of the Java SE Platform. A version string consists of a version number optionally followed by pre-release and build information.
Version numbers
A version number, $VNUM , is a non-empty sequence of elements separated by period characters (U+002E). An element is either zero, or an unsigned integer numeral without leading zeros. The final element in a version number must not be zero. When an element is incremented, all subsequent elements are removed. The format is:
The sequence may be of arbitrary length but the first four elements are assigned specific meanings, as follows:
$FEATURE.$INTERIM.$UPDATE.$PATCH
- $FEATURE — The feature-release counter, incremented for every feature release regardless of release content. Features may be added in a feature release; they may also be removed, if advance notice was given at least one feature release ahead of time. Incompatible changes may be made when justified.
- $INTERIM — The interim-release counter, incremented for non-feature releases that contain compatible bug fixes and enhancements but no incompatible changes, no feature removals, and no changes to standard APIs.
- $UPDATE — The update-release counter, incremented for compatible update releases that fix security issues, regressions, and bugs in newer features.
- $PATCH — The emergency patch-release counter, incremented only when it’s necessary to produce an emergency release to fix a critical issue.
The fifth and later elements of a version number are free for use by platform implementors, to identify implementor-specific patch releases.
A version number never has trailing zero elements. If an element and all those that follow it logically have the value zero then all of them are omitted.
The sequence of numerals in a version number is compared to another such sequence in numerical, pointwise fashion; e.g., 10.0.4 is less than 10.1.2 . If one sequence is shorter than another then the missing elements of the shorter sequence are considered to be less than the corresponding elements of the longer sequence; e.g., 10.0.2 is less than 10.0.2.1 .
Version strings
A version string, $VSTR , is a version number $VNUM , as described above, optionally followed by pre-release and build information, in one of the following formats:
$VNUM(-$PRE)?\+$BUILD(-$OPT)? $VNUM-$PRE(-$OPT)? $VNUM(+-$OPT)?
- $PRE , matching ([a-zA-Z0-9]+) — A pre-release identifier. Typically ea , for a potentially unstable early-access release under active development, or internal , for an internal developer build.
- $BUILD , matching (0|99*) — The build number, incremented for each promoted build. $BUILD is reset to 1 when any portion of $VNUM is incremented.
- $OPT , matching ([-a-zA-Z0-9.]+) — Additional build information, if desired. In the case of an internal build this will often contain the date and time of the build.
A version string 10-ea matches $VNUM = «10» and $PRE = «ea» . The version string 10+-ea matches $VNUM = «10» and $OPT = «ea» .
When comparing two version strings, the value of $OPT , if present, may or may not be significant depending on the chosen comparison method. The comparison methods compareTo() and compareToIgnoreOptional() should be used consistently with the corresponding methods equals() and equalsIgnoreOptional() .
A short version string, $SVSTR , often useful in less formal contexts, is a version number optionally followed by a pre-release identifier:
This is a value-based class; use of identity-sensitive operations (including reference equality ( == ), identity hash code, or synchronization) on instances of Version may have unpredictable results and should be avoided.
Method Summary
As of Java SE 10, the first element of a version number is not the major-release number but the feature-release counter, incremented for every time-based release.
As of Java SE 10, the second element of a version number is not the minor-release number but the interim-release counter, incremented for every interim release.
Parses the given string as a valid version string containing a version number followed by pre-release and build information.
As of Java SE 10, the third element of a version number is not the security level but the update-release counter, incremented for every update release.
Methods declared in class java.lang.Object
Method Detail
parse
Parses the given string as a valid version string containing a version number followed by pre-release and build information.
feature
interim
update
patch
major
As of Java SE 10, the first element of a version number is not the major-release number but the feature-release counter, incremented for every time-based release. Use the feature() method in preference to this method. For compatibility, this method returns the value of the feature element.
minor
As of Java SE 10, the second element of a version number is not the minor-release number but the interim-release counter, incremented for every interim release. Use the interim() method in preference to this method. For compatibility, this method returns the value of the interim element, or zero if it is absent.
security
@Deprecated(since="10") public int security()
As of Java SE 10, the third element of a version number is not the security level but the update-release counter, incremented for every update release. Use the update() method in preference to this method. For compatibility, this method returns the value of the update element, or zero if it is absent.
version
Returns an unmodifiable List of the integers represented in the version number. The List always contains at least one element corresponding to the feature version number.
pre
build
optional
compareTo
Compares this version to another. Each of the components in the version is compared in the following order of precedence: version numbers, pre-release identifiers, build numbers, optional build information. Comparison begins by examining the sequence of version numbers. If one sequence is shorter than another, then the missing elements of the shorter sequence are considered to be less than the corresponding elements of the longer sequence. A version with a pre-release identifier is always considered to be less than a version without one. Pre-release identifiers are compared numerically when they consist only of digits, and lexicographically otherwise. Numeric identifiers are considered to be less than non-numeric identifiers. A version without a build number is always less than one with a build number; otherwise build numbers are compared numerically. The optional build information is compared lexicographically. During this comparison, a version with optional build information is considered to be greater than a version without one.
compareToIgnoreOptional
Compares this version to another disregarding optional build information. Two versions are compared by examining the version string as described in compareTo(Version) with the exception that the optional build information is always ignored. This method provides ordering which is consistent with equalsIgnoreOptional() .
toString
equals
Determines whether this Version is equal to another object. Two Version s are equal if and only if they represent the same version string.
equalsIgnoreOptional
Determines whether this Version is equal to another disregarding optional build information. Two Version s are equal if and only if they represent the same version string disregarding the optional build information.
hashCode
Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2023, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.