能否使用JDK 1.6编写Java代码并在JRE 1.5上运行?

6

在使用JDK 1.6编译的Java代码中,是否有选项可以构建为在JRE 1.5上运行的代码?

附注:我是Java的新手。


1
为什么它不能在Java 5上构建? - Thorbjørn Ravn Andersen
是的和不是的:你必须确定你正在使用的Java 1.6特定功能,并确定在1.5中是否有完成同样功能的方法。 - Patrick
我很抱歉我的初始问题不够清晰。 - amit kumar
请参见https://dev59.com/MkrSa4cB1Zd3GeqPUj6m#1710969 - Kevin Bourrillion
4个回答

10
如果你使用1.6编译代码,则无法在1.5上运行。如果你想要它在1.5上运行,那么可以用1.5编译代码,这样代码就能同时在两个版本上运行。
尝试使用1.5进行编译,如果出现错误,则发帖寻求帮助。只有当你在代码中使用了特定的1.6增强功能时,它才无法在1.5上编译。
回答实际问题。
  javac -target 1.5

更多详细信息请查看此处


抱歉表述不清。我的意思是,是否有选项可以使用JDK 1.6编译后,在JRE 1.5上运行Java代码。 - amit kumar
在这种情况下,请在命令行上使用目标选项。我会相应地编辑答案。 - Vincent Ramdhanie
7
注意,这样做并不能警告您是否在使用仅存在于Java 1.6中的API。 - Peter Lawrey

10

1
请注意,最好“只使用JDK 1.5编译”,因为新的编译器具有错误修复和性能改进。 - Kevin Bourrillion
2
你确定不需要“-bootclasspath jdk1.5.0\lib\rt.jar”来防止它使用Java 6 API吗? - Thilo

6

请看javac的“-source”和“-target”选项:

http://java.sun.com/javase/6/docs/technotes/tools/windows/javac.html

-source release

指定所接受的源代码版本。允许使用以下值:

  • 1.3 编译器不支持断言、泛型或其他在JDK 1.3之后引入的语言特性。
  • 1.4 编译器接受包含断言的代码,这是在JDK 1.4中引入的。
  • 1.5 编译器接受包含泛型和其他在JDK 5中引入的语言特性的代码。
  • 5 与1.5同义。
  • 1.6 这是默认值。在Java SE 6中没有引入语言更改。但是,现在会将源文件中的编码错误报告为错误,而不是警告。
  • 6 与1.6同义。

+

-target version

生成针对指定版本虚拟机的类文件。类文件可以在指定版本及以后的虚拟机上运行,但不能在更早的虚拟机上运行。有效的目标版本为1.1、1.2、1.3、1.4、1.5(也可以写作5)和1.6(也可以写作6)。

-target的默认值取决于-source的值: - 如果没有指定-source,则-target的值为1.6

  • 如果-source是1.2,则-target的值为1.4
  • 如果-source是1.3,则-target的值为1.4
  • 对于-source的所有其他值,-target的值都等于-source的值。

3
除此之外,类库也是不同的。因此,如果你想确保它可以在Java5上运行,请使用JDK5,而不仅仅是带有--source 6的JDK6。 - Thilo

4
这完全取决于您使用的API。Swing、Instrumentation、JConsole等内容会随时间而变化。
如果您尝试访问以下链接:http://www.coderanch.com/t/382318/Java-General/java/New-Features-Java,它将提供指向各个主要版本之间差异的页面链接,其中包括: http://java.sun.com/javase/6/webnotes/features.html是最新版本中已更改/新增功能的列表。
希望这能给您一些想法。
当然,然后您需要在1.5下编译它,以便在该JRE下运行。

3
+1 for API。没有其他人提到过这一点,如果你编写的代码使用了在1.5和1.6之间发生变化的API,那么这可能会对你的代码产生影响。-source选项和-target选项在这种情况下都无法帮助你。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接