我曾见过这样讨论的编译选项的JDK的分布可以运行`的javac -source 1.6 -target 1.5`? 。 我理解的源和目标的各个选项。 我不明白为什么源代码版本是高于目标版本。 编译代码,旧的目标是有道理的。 但是,在这种情况下,为什么不我们只是使用-source最古老的目标,我们希望能够上运行
Answer 1:
Java是向后兼容的。 您可以使用-source选项来指定用于编译的Java版本并使用-target选项指定最低的Java版本支持。 例如。 如果我指定的1.4的目标,那么我的程序将无法在Java 1.3的或更低的运行。 请参阅以下的javac 文档获取更多信息。 特别是在交叉编译选项部分
Answer 2:
- 来源:您的源代码需要编译的版本。
- 目标:要支持最古老的JRE版本。
同时务必设置引导类路径,以确保您的计划在旧的虚拟机将工作。
从javac
文件 :
交叉编译实施例
下面的示例使用的javac编译将在1.6虚拟机上运行的代码。
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
如果没有指定自举类的正确版本,编译器将使用旧的语言规则(在本例中,将使用Java编程语言的1.6版本)使用新的自举类结合,这可能会导致类文件不旧的平台上工作(在这种情况下,Java SE 6中),因为引用不存在的方法,可以得到包括在内。
Answer 3:
彼得曾确实提到了很多关键点的编译过程中要记住。 作为事实上,即使我遇到了类似的问题,有时回来,并希望分享的许多问题的根本原因。
我有这不得不编译和做一个源代码兼容它(-source和-target) 的Java“1.8”。 本身有代码
- 商标符号的地块,因此我无法识别的字符结束了(我必须调整的IntelliJ IDEA的编码设置)
- 变化的地块
java.sql.*
包 - 很多第三方库的用法。 别给我解释的难度调试那里,等等等等的恐惧。
某些更改后,我结束了它具有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之后,甲骨文已经推出了更严格的验证和改变了类格式的比特-包含一个堆栈地图,用来验证码是否正确 。 我见过唯一的例外是因为一些方法没有一个有效的栈图。 我终于尝试了包括很多JVM选项来调整设定,但不成功。
<jvmarg value="bootclasspath:{env.JAVA_HOME}\jre\bin\rt.jar" prefix="-X"/>
毫无效果。 唯一的解决办法是包括
<jvmarg value=":UseSplitVerifier" prefix="-XX"/>
在Java 1.7只允许名义字节代码验证。 因为这是用Java 1.8带下,唯一的选择是使用
<jvmarg value="-noverify"/>
Answer 4:
JDK1.8将不再支持 - 源极和-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