#!/usr/bin/env python3 # extract major/minor version number from a given class file import os import sys if len(sys.argv) < 2: print("class file name missing") sys.exit(1) classfile = sys.argv[1] if not os.path.isfile(classfile): print("class file " + classfile + " does not exist") sys.exit(1) with open(classfile,"rb") as f: ba = f.read(8) if len(ba) < 8: print("given file is not a class file") sys.exit(1) if ba[0] != 0xca or ba[1] != 0xfe or ba[2] != 0xba or ba[3] != 0xbe: print("given file is not a class file") sys.exit(1) major = int(ba[6]) << 8 | int(ba[7]) minor = int(ba[4]) << 8 | int(ba[5]) # dictionary: (Java class file major version, Java version) # OpenJDK distributions: # AdoptOpenJDK : https://adoptopenjdk.net/ (before July 2021) # Adoptium : https://adoptium.net/ (from July 2021 on) javaDict = { 63: "Java 19 (Adoptium Support: MAR-2023)", 62: "Java 18 (Adoptium Support: SEP-2022)", 61: "Java 17 (LTS: Adoptium Support: >= OCT-2027)", 60: "Java 16 (Adoptium Support: SEP-2021)", 59: "Java 15 (AdoptOpenJDK Support: MAR-2021)", 58: "Java 14 (AdoptOpenJDK Support: SEP-2020)", 57: "Java 13 (AdoptOpenJDK Support: MAR-2020)", 56: "Java 12 (AdoptOpenJDK Support: SEP-2019)", 55: "Java 11 (LTS: Adoptium Support: >= OCT-2024)", 54: "Java 10 (AdoptOpenJDK Support: SEP-2018)", 53: "Java 9 (AdoptOpenJDK Support: MAR-2018)", 52: "Java 8 (1.8 - LTS: Adoptium Support: >= NOV-2026)", 51: "Java 7 (1.7)", 50: "Java 6 (1.6)", 49: "Java 5 (1.5)", 48: "Java 1.4", 47: "Java 1.3", 46: "Java 1.2", 45: "Java 1.0/1.1" } if major in javaDict: java = javaDict[major] else: java = "unknown" print("major: 0x%04x (%d) , minor: 0x%04x (%d) , version: %s" % (major, major, minor, minor, java))