function class_version --argument-names class_file if not string match -q '*.class' "$class_file" echo "Expected a Java class file but got: $class_file" return 1 end # Use the `file` command if available if command -q file command file "$class_file" return 0 end javap -verbose "$class_file" | string match -rq 'major version: (?\d+)' set -l version_name # https://en.wikipedia.org/wiki/Java_class_file#General_layout switch "$major_version" case 65 set version_name 'Java SE 21' case 64 set version_name 'Java SE 20' case 63 set version_name 'Java SE 19' case 62 set version_name 'Java SE 18' case 61 set version_name 'Java SE 17' case 60 set version_name 'Java SE 16' case 59 set version_name 'Java SE 15' case 58 set version_name 'Java SE 14' case 57 set version_name 'Java SE 13' case 56 set version_name 'Java SE 12' case 55 set version_name 'Java SE 11' case 54 set version_name 'Java SE 10' case 53 set version_name 'Java SE 9' case 52 set version_name 'Java SE 8' case 51 set version_name 'Java SE 7' case 50 set version_name 'Java SE 6.0' case 49 set version_name 'Java SE 5.0' case 48 set version_name 'JDK 1.4' case 47 set version_name 'JDK 1.3' case 46 set version_name 'JDK 1.2' case 45 set version_name 'JDK 1.1' case '*' set version_name 'Unknown Java version' end echo "$version_name (major version $major_version)" end