Java8 编译生成 Java6 Class文件
所属分类 java8
浏览量 12
JDK 提供的跨版本编译参数
注意语法和 API 的兼容性限制
Java 编译器 javac 提供两个核心参数来控制跨版本编译
参数 作用
-source 版本 指定编译时使用的 Java 语法版本(如 6 表示仅允许 Java 6 及更早的语法)
-target 版本 指定生成的 Class 文件的目标版本(如 6 表示兼容 Java 6 运行时)
-bootclasspath 指定目标版本的核心类库(必加,否则易出现运行时错误)
# 假设 JDK 6 的安装目录为 /usr/local/jdk1.6.0_45
javac \
-source 6 \ # 语法限制为 Java 6
-target 6 \ # Class 文件版本为 6(对应 JVM 版本 50)
-bootclasspath /usr/local/jdk1.6.0_45/jre/lib/rt.jar \ # 绑定 Java 6 核心库
-classpath 你的依赖库路径 \
YourJavaFile.java # 要编译的 Java 文件
-bootclasspath 必加项(最容易踩坑)
如果只加 -source 6 -target 6,编译能通过,
但运行时可能报错(如 NoSuchMethodError/IllegalAccessError):
原因:
Java8 的 rt.jar 中部分类 / 方法在 Java6 中不存在,
即使语法限制为 Java6,编译器仍会默认引用 Java8 的核心库,导致生成的 Class 文件依赖高版本 API;
解决:
必须通过 -bootclasspath 指定 Java6 的 rt.jar(需提前下载 JDK 6,不能用 Java8 的 rt.jar 替代)
语法和API 限制
语法限制:
-source 6 会禁止使用 Java 7/8 的新语法
如 Lambda、try-with-resources、菱形运算符 <>、多异常捕获等),否则编译直接报错;
API 限制:
即使语法合规,也不能调用 Java 7/8 新增的 API,
如 java.util.stream、Optional、String.join() 等,
必须仅使用 Java6 及更早的 API,
可通过 Java6 的 rt.jar 校验,引用高版本 API 会编译报错
Class 文件版本对应关系
验证编译结果是否为 Java6 版本:
Class 文件的版本号可通过 javap 查看:
# 编译后查看 Class 文件版本
javap -verbose YourJavaFile.class | grep "major version"
Java6 对应的 major version 是 50,Java8 是 52,
若输出 50 则说明目标版本正确
Java简史
上一篇
《华杉讲透孙子兵法》笔记
股市游击战十六字诀解析
spring.application.name的作用