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

Ada*_*Lee 40 java compilation javac backwards-compatibility

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

例如,-source 1.5-target 1.6

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

ska*_*man 34

来自javac文档:

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

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

在你的例子中:

-source 1.5 and -target 1.6
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,我发现`javac`不支持所有组合.我实际上也有一个用例.在Java 6中内置了JAX-WS,因此我希望在没有额外库的情况下使用普通Java 6的解决方案.然后,该解决方案需要一些客户在Java 5 JVM上可执行(并且JAX-WS引入了侧面)并且`@Override`语法已更改,因此Java 5 javac无法立即对其进行编译.(这是预备,今天可能更容易) (2认同)
  • 另请参阅 [this answer](http://stackoverflow.com/a/10663478/418556) 中进一步描述的“-bootclasspath”。 (2认同)

rap*_*aëλ 11

-source表明您的源代码具有什么级别的合规性:您使用的是注释吗?那你至少需要1.5; 你@override在接口实现上使用,你需要1.6等等

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


Ano*_*sse 7

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

然而,target在使用1.7 JDK时设置为例如1.6 确实有意义.

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

ArrayList<Integer> foo = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

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

  • 我发现@Tomas说的是真的.哪个是刺激性的,因为这似乎是最有用的组合?它阻止您在1.7源项目中编写可以在1.6项目中链接的库.这有什么解决方案吗? (6认同)
  • 虽然这是一个很好的理论,但实际上并没有这样做.如果您尝试使用源1.7和目标1.6,您将收到此错误:"源版本1.7需要目标版本1.7" (3认同)