首页  

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的作用