javac源和目标选项

jog*_*ito 26 java javac

我已经看到了JDK的发行版可以运行`javac -source 1.6 -target 1.5`中讨论的编译选项.我理解源和目标的各个选项.我不明白为什么源版本高于目标版本.编译旧目标的代码是有道理的.但在这种情况下,为什么我们不使用我们希望能够运行的最老目标的-source

Pet*_*eng 25

  • source:源代码编译所需的版本.
  • target:您要支持的最早的JRE版本.

一定要设置bootclasspath以确保您的程序可以在较旧的VM上运行.


javac 文档:

交叉编译示例

以下示例使用javac编译将在1.6 VM上运行的代码.

C\:>javac -source 1.6 -target 1.6 -bootclasspath C:\jdk1.6.0\lib\rt.jar -extdirs "" OldCode.java
Run Code Online (Sandbox Code Playgroud)

-source 1.6选项指定使用Java编程语言的1.6(或6)版进行编译OldCode.java.选项-target 1.6选项可确保生成的类文件与1.6 VM兼容.请注意,在大多数情况下,-target选项的值是-source选项的值; 在此示例中,您可以省略该-target选项.

您必须指定-bootclasspath选项以指定正确版本的引导类(rt.jar库).如果没有,编译器会生成以下警告:

C:\>javac -source 1.6 OldCode.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
Run Code Online (Sandbox Code Playgroud)

如果没有指定正确版本的bootstrap类,编译器将使用旧的语言规则(在本例中,它将使用Java编程语言的1.6版本)与新的引导类相结合,这可能导致类文件不适用于较旧的平台(在本例中为Java SE 6),因为可以包含对不存在的方法的引用.


gre*_*ode 21

Java向后兼容.使用-source选项指定用于编译的java版本,并使用-target选项指定要支持的最低java版本.例如.如果我指定1.4的目标,那么我的程序将无法在java 1.3或更低版本上运行.有关详细信息,请参阅以下javac 文档.特别是关于交叉编译选项的部分

  • 为了利用实现必须提供的各种改进。Java 1.8 VM 将比 Java 1.0 VM 有更多功能和改进。该语言向后兼容,但不向后兼容用于运行它的设备。 (3认同)
  • 那么两者兼得有什么意义呢?为什么我们不只使用最高级别的源版本,然后将目标设为 1.1 之类的东西?如果java是向后兼容的,那么限制目标版本有什么意义呢? (2认同)
  • 使用较新的源版本进行编译以在较旧的目标版本中运行是否会出现问题?假设我有一些在 Java 8 中使用 lambda 的代码...但我的服务器运行 Java 7。那么 `-source 1.8 -target 1.7` 是否能够让我的代码在 Java 7 中正常运行? (2认同)