javac的源和目标选项(javac source and target options)

2019-07-21 22:44发布

我曾见过这样讨论的编译选项的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”。 本身有代码

  1. 商标符号的地块,因此我无法识别的字符结束了(我必须调整的IntelliJ IDEA的编码设置)
  2. 变化的地块java.sql.*
  3. 很多第三方库的用法。 别给我解释的难度调试那里,等等等等的恐惧。

某些更改后,我结束了它具有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


文章来源: javac source and target options
标签: java javac