javac源和目标选项

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

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

  • 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 

-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 

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

Peter Tseng确实提到了编译过程中要记住的许多要点。 事实上,即使我在某个时候遇到过类似的问题,也想分享许多问题的根本原因。

我有一个源代码,必须编译并使其兼容(-source&-target)Java’1.8 。 代码本身有

  1. 很多商标符号因此我最终得到了无法识别的字符(我不得不调整IntelliJ Idea的编码设置)
  2. java.sql.*包进行了很多更改
  3. 许多第三方库的使用。 告诉我解释调试困难的恐怖,等等等等等等。

在某些更改后,我最终得到了一个代码,该代码具有相同数量的JUnit测试用例。 最终我遇到了java.lang.VerifyError 。 当我在不同的库/环境中编译和运行代码时(我不是这样),当我理解发生这样的错误时,我感到很震惊。

我几乎想念的是,为了表彰测试必须在隔离环境中运行的事实, Junit及其测试用例在一个单独的分叉VM中执行

        

这显然将作为一个单独的进程跨越,并作为执行中的独立应用程序。 尽管IDE同步跨越两个进程,但JVM几乎是孤立的。

在Java 1.7之后,Oracle引入了更严格的validation并稍微改变了类格式 – 包含堆栈映射,用于validation代码是否正确 。 我见过的例外是因为某些方法没有有效的堆栈映射。 我最终尝试包含许多JVM选项来调整设置,但是徒劳无功。

  

没有用。 唯一的解决方法是包括

  

在Java 1.7中只允许标称字节码validation。 由于这是在Java 1.8中取消的,唯一的选择是使用

  

JDK1.8将不再支持-source和-target小于1.6

 "c:\Program Files\Java\jdk1.8.0_121\bin\javac.exe" -source 1.3 HelloWorld.java warning: [options] bootstrap class path not set in conjunction with -source 1.3 warning: [options] source value 1.3 is obsolete and will be removed in a future release warning: [options] target value 1.4 is obsolete and will be removed in a future release warning: [options] To suppress warnings about obsolete options, use -Xlint:-options. 4 warnings