使用Java编译器(javac
)时,我们可以指定两种兼容性。一个使用-source
,另一个使用-target
。这两者有什么区别?
例如,-source 1.5
和-target 1.6
?
此外,我们是否使用不同的源和目标兼容级别?
答案 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兼容字节代码。但我还没有验证编译器是否真的会这样做。 不幸的是,这似乎没有在实践中实施。