我看到了类似于Which JDK's distributions can run `javac -source 1.6 -target 1.5`?这样的编译选项,我理解了源码和目标码的各个选项。但是我不明白为什么源码版本比目标码版本高。将代码编译为旧版本的目标码是有意义的。但是在这种情况下,为什么我们不只使用最旧的目标码的源码选项呢?
我看到了类似于Which JDK's distributions can run `javac -source 1.6 -target 1.5`?这样的编译选项,我理解了源码和目标码的各个选项。但是我不明白为什么源码版本比目标码版本高。将代码编译为旧版本的目标码是有意义的。但是在这种情况下,为什么我们不只使用最旧的目标码的源码选项呢?
确保还设置了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虚拟机兼容。请注意,在大多数情况下,-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版本)与新的bootstrap类结合,这可能会导致类文件不能在较旧的平台上工作(在这种情况下,Java SE 6),因为可能包括对不存在方法的引用。
Java具备向后兼容性。您可以使用-source选项指定用于编译的Java版本,使用-target选项指定支持的最低Java版本。例如,如果我指定了目标为1.4,则我的程序将无法在Java 1.3或更低版本上运行。请参阅以下javac 文档以获取更多信息,特别是关于Cross-Compilation Options部分。
Peter Tseng提到了许多编译时需要记住的关键点。事实上,我曾经遇到过类似的问题,想分享一下许多问题的根本原因。
我有一个源代码,必须编译并使其与Java '1.8'兼容(-source和-target)。代码本身有以下问题:
在做了某些更改后,我最终得到了相等数量的JUnit测试用例运行的代码。最终我遇到了java.lang.VerifyError。当我理解这种错误发生在我在不同的库/环境中编译和运行代码时,我感到震惊。
我几乎错过了一个重要的事实,即为了尊重测试必须在隔离环境中运行的事实,JUnit及其测试用例在单独的分叉VM中执行。
<target name="runJunit">
<junit printonsummary="on"
haltonfailure="off"
fork="true"
forkmode="once">
<formatter />
<batchtest />
<classpath />
</junit>
</target>
这显然将作为一个独立的应用程序在执行时被分为一个单独的进程。尽管IDE同步跨越两个进程,但JVM基本上是隔离的。
在Java 1.7之后,Oracle引入了更严格的验证并改变了类格式——包含堆栈映射,用于验证代码是否正确。我看到的异常是因为某些方法没有有效的堆栈映射。我最终尝试了包括很多JVM选项来调整设置,但都无济于事。
<jvmarg value="bootclasspath:{env.JAVA_HOME}\jre\bin\rt.jar" prefix="-X"/>
什么都没用。唯一的解决办法是包含
。<jvmarg value=":UseSplitVerifier" prefix="-XX"/>
<jvmarg value="-noverify"/>
JDK1.8将不再支持源代码和目标代码低于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
-source 1.8 -target 1.7
是否能够使我的代码在Java 7中正常运行? - evaldeslacasa