如何确定编译Java文件的准确JRE?Jar文件修改的JRE匹配需求
如何找到编译Java文件时使用的准确JRE版本?
这问题我太熟了!之前修改jar包的时候也踩过这个坑,找原JRE版本确实是关键——版本不匹配的话,新编译的class文件很可能会出现兼容性问题,比如运行时报UnsupportedClassVersionError。给你几个靠谱的实操方法:
1. 用javap命令查看class文件的版本号(最准确)
这是官方最推荐的方法,直接从class文件的字节码里读取编译版本:
- 打开终端/命令提示符,导航到存放目标
.class文件的目录 - 执行命令:
javap -verbose YourClass.class | grep "major version" - 输出会类似
major version: 52,然后对照下面的版本对应表就能找到对应的JRE版本:- 55 → Java 11
- 52 → Java 8
- 51 → Java 7
- 50 → Java 6
- 49 → Java 5
- 48 → Java 1.4
- 47 → Java 1.3
- 46 → Java 1.2
- 45 → Java 1.1
注:JDK编译出来的class文件版本和对应的JRE是完全匹配的,比如用JDK 8编译的class,对应的运行JRE就是Java 8。
2. 通过反编译工具直接查看(最直观)
如果你已经在用JD-GUI或者其他反编译工具,其实不用额外跑命令:
- 用JD-GUI打开目标
.class文件或者整个jar包 - 在文件顶部的注释里,一般会显示类似这样的内容:
Compiled from "YourClass.java" (version 1.8 : 52.0, super bit) - 这里的
version 1.8就是原编译时用的JRE版本,52.0对应的就是上面说的major version。
3. 查看jar包的MANIFEST.MF文件(补充方法)
部分jar包会在META-INF/MANIFEST.MF文件里记录编译相关的信息:
- 解压jar包,找到
META-INF/MANIFEST.MF文件打开 - 查找
Build-Jdk或者Created-By字段,比如:Build-Jdk: 1.8.0_291 Created-By: 1.8.0_291 (Oracle Corporation) - 这里的版本号就是原编译用的JDK/JRE版本,但要注意不是所有jar包都会包含这个字段,所以只能作为补充验证。
额外提示:找到版本后怎么确保编译匹配?
找到原JRE版本后,一定要用对应版本的JDK(JDK包含对应JRE)来编译:
- 如果用IDE,把项目的SDK设置为对应版本,同时在项目结构里指定
Language level为对应版本 - 如果用命令行编译,要加上
-source和-target参数,还可以指定-bootclasspath确保用的是对应版本的核心类库:javac -source 1.8 -target 1.8 -bootclasspath /path/to/jdk1.8/jre/lib/rt.jar YourClass.java
内容的提问来源于stack exchange,提问作者user2149140
相关产品推荐
相关产品推荐

