1

我已经使用参数-source 1.5-target 1.5用 java 版本 1.6 编译了我的源代码,编译器根本没有抱怨。

尽管如此,由于缺少方法,该应用程序仍无法使用 java 1.5 运行。当然我可以重写我的一些源代码以符合 1.5,但我不明白的是;底部的java字节码不应该“向前”兼容吗?

方法不是转换成字节码了吗?是否可以将 1.6 库/方法(以前为 String.isEmpty())编译为 1.5 字节码并将其全部打包到存档中?

4

5 回答 5

6

如果您的意思是基本 Java 库方法,那么不,这些方法在您编译时不会转换为字节码;它们已经被 Sun(或第三方 JVM 分发器)编译为字节码并安装在您的操作系统上。它们被您的编译代码引用和使用。

于 2009-07-07T18:08:28.840 回答
3

您需要的全套命令行选项是:

java -source 1.5 -target 1.5 -bootclasspath /usr/jdk/jdk1.5.0_17/jre/lib/rt.jar

(将 bootclasspath 更改为您的机器的设置。)

当然,1.6 中的 API 增强不会出现在 1.5 中。1.5 是其使用寿命结束期的大部分时间,因此您可能需要考虑最低 1.6。

于 2009-07-07T18:19:25.590 回答
1

我不相信 java 会向后重新编译本机 java 代码。因此,如果您拨打 1.6 电话 - 您将无法在 1.5 中访问它

于 2009-07-07T18:07:31.323 回答
1

您可以将要编译的库更改为较旧的库。在像 eclipse 这样的包中,每个安装的 JDK 都应该出现在“选择库”窗口中,您可以选择要编译的那个。

如果没有,您应该能够在您的 ant 文件或 CLI 编译命令中覆盖它。

如果针对较旧的 JVM,则必须这样做,否则您可能会使用不可用的调用。

于 2009-07-07T18:10:56.183 回答
1

source 参数仅使编译器在语言语法级别进行检查(例如,如果遇到泛型,source=1.4 会抱怨),但不会限制您仅使用指定 Java 版本中可用的 API。

target 参数将使编译器输出可以被指定版本的运行时使用的类文件,但不会(就像 -source 一样)验证任何 API 一致性。

于 2009-07-07T18:27:56.977 回答