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

IT小君   2021-12-18T00:16:24

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

例如,-source 1.5-target 1.6

另外,有没有我们使用不同的源和目标兼容级别的情况?

评论(3)
IT小君

javac 文档

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

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

在你的例子中:

-source 1.5 and -target 1.6

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

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

2021-12-18T00:16:25   回复
IT小君

-source指示什么级别遵守你的源代码有:您使用的注解?那么你至少需要1.5; 您是否@override在接口实现上使用,您需要1.6

-target指定了Java版本要能够在运行的类。您可以使用 Java SE7编译器并编译以在 Java SE 上运行1.5

2021-12-18T00:16:26   回复
IT小君

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

然而,target在使用 1.7 JDK 时设置为例如 1.6 是有意义的

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

ArrayList<Integer> foo = new ArrayList<>();

仅在 1.7+ 源版本中有效的应该编译为 1.6 兼容的字节码。但我还没有验证编译器是否真的会这样做。不幸的是,这似乎并没有在实践中实施。

2021-12-18T00:16:28   回复