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

最近有一项面向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 9开始,javac的-target和-source命令将不再支持1.5/5及更早版本)