2015-12-21 84 views
1

我的应用程序应该在其上运行的目标系统使用Java 6.在我的开发机器上,我拥有Java 7.可以在不下载Java的情况下进行开发6?使用Java 7编译Java 6而不安装Java 6

我在http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html一个例子进行交叉编译发现:

javac -source 1.6 -target 1.6 -bootclasspath C:\jdk1.6.0\lib\rt.jar -extdirs "" OldCode.java 

然而,这也需要一个rt.jar中,属于Java的6有没有更简单的方式存在?

+4

你在用什么IDE?当您的项目使用JDK 7时,您可以轻松地将项目语言级别设置为6. – OPK

+1

很确定,Java 8中也存在'rt.jar ... ...但它仍然位于JRE子目录中。 – Makoto

+0

@JasonZ:我不使用任何IDE。 – user1934428

回答

7

新的Java版本通常会同时改变Java语言(源和类文件格式)和Java API。

即使源为新格式(这些版本分别由-target-source指定),Java编译器也可以以旧格式发出类文件。因此,您不需要旧的编译器来定位旧的JVM。

但是,对Java API的更改有点难以解决。最简单的方法是使用您定位的Java版本的API进行编译(-bootclasspath)。当然,您可能确信自己没有使用更新的API,并跳过这一步,但唯一确定的方法实际上是针对旧运行时库进行编译和测试。

简而言之,虽然交叉编译有助于将相同的源代码与不同的Java版本一起使用,但您应该针对您打算使用的实际Java版本进行编译和测试,这需要旧的JRE(或JDK) 。

顺便说一句,所有这些设置也可以在Java IDE中使用。例如,在日食,一会设置项目的编译器设置的合规性水平,并相应的“JRE系统库”添加到项目的“构建路径”:

enter image description here

+0

使用'add the适当的“JRE系统库”,是否将Java 6中的rt.jar添加到构建路径中? – user1934428

+1

不,您必须替换(或“编辑”)“JRE系统库”。我添加了一个截图。 – meriton

0

下面的命令应该足以满足您的要求。 'javac -source 1.6 -target 1.6 OldCode.java'

通过这个命令,你告诉编译器应该生成与java 6兼容的类文件。任何java 7特定的都会导致编译错误。关于rt.jar,您不需要具有java6特定版本。如上所述,上述命令自动确保输出与java6兼容。

UPDATE /更正:

通过下面的链接去http://www.javaworld.com/article/2077388/core-java/what-version-is-your-java-code.html后很清楚为什么建议和重要的是要与 - 源极和/或-target标志一起使用-bootstrap标志。

+0

嗯....但是文档明确指出:_You **必须指定-bootclasspath选项来指定引导类(rt.jar库)的正确版本_。在什么情况下我可以忽略这个限制?我不太确定'rt.jar'实际上包含了什么。 – user1934428

+1

“rt”代表“运行时”。它包含Java API及其大部分实现。因此,根据运行时使用的相同API进行编译是非常可取的,以免人们无意中使用目标Java版本尚不可用的API。 – meriton

+1

@ user1934428最后,我找到了一个链接[here](http://www.javaworld.com/article/2077388/core-java/what-version-is-your-java-code.html),它解释了使用-bootstrap标志并帮助回答你的问题。它还演示了如果未指定-bootstrap,则可以通过使用StringBuffer API作为示例在运行时出错。我想我需要纠正我的答案,以反映相同的情况。 –