-source和-target兼容性有什么区别?

时间:2012-05-19 08:02:07

标签: java compilation javac backwards-compatibility

使用Java编译器(javac)时,我们可以指定两种兼容性。一个使用-source,另一个使用-target。这两者有什么区别?

例如,-source 1.5-target 1.6

此外,我们是否使用不同的源和目标兼容级别?

3 个答案:

答案 0 :(得分:30)

来自javac docs

  

-source 指定接受的源代码版本。

     

-target 生成以指定版本的VM为目标的类文件。类文件将在指定的目标和更高版本上运行,但不会在早期版本的VM上运行。

在你的例子中:

-source 1.5 and -target 1.6

这将用于确保源代码与JDK 1.5兼容,但应生成用于JDK 1.6及更高版本的类文件。

相当为什么你会这样做是另一回事。

答案 1 :(得分:11)

-source表示您的源代码符合的合规程度:您使用的是注释吗?那你至少需要1.5;你在接口实现上使用@override,你需要1.6

-target指定您希望能够在哪个Java版本上运行您的类。您可以使用Java SE 7编译器并编译以在Java SE 1.5上运行。

答案 2 :(得分:7)

这对于生成使用旧版Java的jar文件非常有用。 我相信到目前为止所有JDK都能够执行旧版本,所以没有真正的理由让目标比源更大。

然而,将target设置为例如有意义。 1.6使用1.7 JDK时。

我不确定,但我相信它可以在某些情况下使用1.7编译器编译1.7 java代码到1.6 jar,例如

等表达式
ArrayList<Integer> foo = new ArrayList<>();
仅在1.7+源版本中有效的

应编译为1.6兼容字节代码。但我还没有验证编译器是否真的会这样做。 不幸的是,这似乎没有在实践中实施。