我已经看到了JDK的发行版可以运行`javac -source 1.6 -target 1.5`中讨论的编译选项?.我理解源和目标的各个选项.我不明白为什么源版本高于目标版本.编译旧目标的代码是有道理的.但在这种情况下,为什么我们不使用我们希望能够运行的最老目标的-source
Pet*_*eng 25
一定要设置bootclasspath以确保您的程序可以在较旧的VM上运行.
从javac 文档:
交叉编译示例
以下示例使用javac编译将在1.6 VM上运行的代码.
Run Code Online (Sandbox Code Playgroud)C\:>javac -source 1.6 -target 1.6 -bootclasspath C:\jdk1.6.0\lib\rt.jar -extdirs "" OldCode.java该
-source 1.6选项指定使用Java编程语言的1.6(或6)版进行编译OldCode.java.选项-target 1.6选项可确保生成的类文件与1.6 VM兼容.请注意,在大多数情况下,-target选项的值是-source选项的值; 在此示例中,您可以省略该-target选项.您必须指定
-bootclasspath选项以指定正确版本的引导类(rt.jar库).如果没有,编译器会生成以下警告:Run Code Online (Sandbox Code Playgroud)C:\>javac -source 1.6 OldCode.java warning: [options] bootstrap class path not set in conjunction with -source 1.6如果没有指定正确版本的bootstrap类,编译器将使用旧的语言规则(在本例中,它将使用Java编程语言的1.6版本)与新的引导类相结合,这可能导致类文件不适用于较旧的平台(在本例中为Java SE 6),因为可以包含对不存在的方法的引用.
gre*_*ode 21
Java向后兼容.使用-source选项指定用于编译的java版本,并使用-target选项指定要支持的最低java版本.例如.如果我指定1.4的目标,那么我的程序将无法在java 1.3或更低版本上运行.有关详细信息,请参阅以下javac 文档.特别是关于交叉编译选项的部分