从 Java 9 开始,javac 的 -target 和 -source 命令将不再支持 1.5/5 及更早版本

  • Alex Blewitt
  • 臧秀涛

2013 年 7 月 1 日

话题:Java语言 & 开发

最近有一项面向 Java 8 和 Java 9 的 JDK 增强提案(JDK Enhancement Proposal),即 JEP 182,意在为 Java 编译器所使用的 -target 和 -source 命令的支持模型制订相关规则。该提案建议,除当前版本外,Java 编译器最多支持 3 个更早的版本。

-target 标志允许编译器生成特定版本的 Java 类文件格式。尽管我们通常指定的是 Java 版本,比如 1.5/5 或 1.6/6,但是该选项实际上会被翻译为生成的类文件中所使用的字节码版本号:

  • 48Java 4
  • 49Java 5
  • 50Java 6
  • 51Java 7
  • 52Java 8(尚未发布)
  • 53Java 9(尚未发布)

-source 标志允许编译器将新的语言构造(如 Lambda 表达式、try-with-resources 以及 switch 中使用字符串等等)看做错误。一些新语言特性(比如 Lambda 表达式)需要使用特定的字节码功能(比如 invokedynamic),因此,-source 指定的版本比 -target 指定的版本还新往往是不可能的。

JEP 182 阐明,在 Java 9 及以后的版本中,javac 的 -target 和 -source 最多支持更早的 3 个版本。Java 6 的产品周期已于今年年初终止,因此 Java 8 编译器的限制是仅向前支持到 Java 6,这种限制应该不会给人们带来重大影响。然而,如果没有特别说明,有些构建工具(比如 Maven)默认兼容的源代码版本是 1.5/5,可能需要加以更新才能在 Java 8 上运行。而 Java 9 则支持 1.9/9、1.8/8、1.7/7 和 1.6/6。

变化已经开始,Java 8 的 -target 不再接受 jsr14 和 1.4 等选项。如果 -source 和 -target 指定的选项是 1.5/5 或更早版本,编译器会发出警告。Java 9 在发布时将不再支持 1.5/5。

从实践的角度看,这一变化看上去不算很大。但是直到最近,OSGi 运行时一直是使用“-source 1.5 -target jsr14”来编译的,这样源代码可以包含泛型,但是生成的字节码却能兼容 J2ME。Eclipse 代码库中去年已经删除了使用 jsr14 的地方。因为 Android 几乎已经消灭了 J2ME (但是不管怎么说,只要像 Felix 和 Equinox 这样的 OSGi 运行时还有用,对 J2ME 的商业需求就仍然存在) ,所以对大多数 Java 开发者而言,使用较新的运行时来编译应该不是问题。

查看英文原文:Java 9 to Drop Support for Compiling 1.5 and Older Source Code

Java语言 & 开发