-source指定源码可使用的java语法版本,-target指定生成字节码兼容的jvm版本;二者须协同,-target不可高于-source;推荐用-release统一约束语法、字节码和api。

javac 的 -source 和 -target 参数用于控制编译过程中的语言特性和字节码兼容性,两者作用不同、必须协同使用,否则可能引发编译失败或运行时异常。
‑source:指定源代码语法支持的 Java 版本
它告诉编译器“允许你在源码中使用哪个版本引入的语言特性”。比如:
-
-source 8:可写 lambda 表达式、方法引用、默认方法等 Java 8 语法;但不能用 var(Java 10)、switch 表达式(Java 14)等新特性。 -
-source 17:支持密封类(sealed classes)、模式匹配 for instanceof 等 Java 17 新语法。 - 若源码用了高版本语法但 -source 设得太低(如用 record 写了 Java 14+ 特性却设 -source 11),编译直接报错。
‑target:指定生成的字节码兼容的目标 JVM 版本
它决定编译出的 .class 文件能被哪个版本及以后的 JVM 加载运行:
-
-target 11:生成的字节码主版本号为 55,只能在 JDK 11+ 的 JVM 上运行;JDK 8 JVM 会抛UnsupportedClassVersionError。 - 注意:-target 不影响语法检查,只约束字节码格式。即使 -source 设得低,-target 也不能高于 -source(javac 会拒绝,如 -source 8 -target 17 报错)。
- 从 Java 9 起,-target 默认与 -source 一致;早期版本(如 Java 6/7)默认 target 是 source - 1,需显式指定避免兼容问题。
常见组合与实际建议
多数项目需兼顾开发便利性与部署环境限制:
- 想用 Java 17 语法,又需在 JDK 17 运行 →
javac -source 17 -target 17 - 团队用 Java 21 写代码,但生产环境只有 JDK 17 JVM →
-source 21 -target 17(可行,但需确保没调用 JDK 21 特有 API) - Maven 中对应配置是
<source>17</source>和<target>17</target>(maven-compiler-plugin) - Gradle 中用
java.sourceCompatibility = JavaVersion.VERSION_17和java.targetCompatibility = JavaVersion.VERSION_17
补充说明:‑release(推荐替代方案)
Java 9 引入的 -release 是更安全的替代方式,它同时约束 source、target 和 bootstrap classpath:
-
javac -release 11等价于-source 11 -target 11,且自动屏蔽 JDK 11 之后新增的 API(如误用String.isBlank()在 -release 8 下会编译失败)。 - 避免因依赖高版本 JDK 编译却部署到低版本 JVM 导致的
NoSuchMethodError或NoClassDefFoundError。 - 只要 JDK 版本 ≥ 所设 release 值(如用 JDK 17 编译 -release 11),就支持该参数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











