java_查看jar包的JDK版本
Java: 查看jar包的JDK版本
今天突然发现新编译的jar包在AS跑不起来了,报错如下:
class file has wrong version 61., should be 55.0

搜了下相关资料,发现是编译的JDK版本过高导致的,
其实就是在Gradle file 中修改了这两行code 所致:
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
这样的话,会使用JDK17去编译jar包。所以只需要把上面的Java Version 修改为比编译的版本低就行了,比如上述报错的编译环境是JDK11 (class file version: 55)。
查看编译的jar包的JDK version可以通过下列途径:
一. 通过版本
通常在使用Java程序时,需要对JDK版本进行核对,JDK构建版本不等于执行的运行版本,需要通过执行类来辨别
-
通过反编译工具jd-gui查看清单文件

-
通过编译的class文件来查看文件信息

二. 通过十六进制
随便将报错的jar包解压,找到任意一个class文件:

使用十六进制文本编辑器打开:

找到主版本号(major version)的显示位置,可以看到显示的是 00 3D, 换算成十进制就是 61, 也就是说,该class file 是通过java17 编译生成的。
Tips: minor version 与 major version 都是以大端格式进行存储的。
三. Java各版本的major version
下表是java各版本的major version:
| Java | Major version |
|---|---|
| 20 | 64 |
| 19 | 63 |
| 18 | 62 |
| 17 | 61 |
| 16 | 60 |
| 15 | 59 |
| 14 | 58 |
| 13 | 57 |
| 12 | 56 |
| 11 | 55 |
| 10 | 54 |
| 9 | 53 |
| 8 | 52 |
| 7 | 51 |
| 6 | 50 |
| 5 | 49 |
| 1.4 | 48 |
| 1.3 | 47 |
| 1.2 | 46 |
| 1.1 | 45 |
| 1.0.2 | 45 |
参考链接
- 查看jar包的JDK版本
- StackOverflow: List of Java class file format major version numbers?