在项目属性的“Java Compiler”部分,有一些“JDK Compliance”的设置。我想将源兼容性设置为 6,将 .class 文件的兼容性设置为 5。这显然是不允许的:我收到消息“类文件兼容性必须大于或等于源兼容性”。
这是 Eclipse 的限制还是 Java 版本兼容性的基本问题?有解决方法吗?
我想在开发和大多数目标中使用 Java 6,但我想为某些目标(例如 Mac)生成 Java 5 兼容的工件。如果这意味着有两个构建,我很好,只要它是相同的来源。
在项目属性的“Java Compiler”部分,有一些“JDK Compliance”的设置。我想将源兼容性设置为 6,将 .class 文件的兼容性设置为 5。这显然是不允许的:我收到消息“类文件兼容性必须大于或等于源兼容性”。
这是 Eclipse 的限制还是 Java 版本兼容性的基本问题?有解决方法吗?
我想在开发和大多数目标中使用 Java 6,但我想为某些目标(例如 Mac)生成 Java 5 兼容的工件。如果这意味着有两个构建,我很好,只要它是相同的来源。
正如 Eclipse 所说,您不能从 java6 源代码生成 java5 类文件,这不是一种选择。如果需要生成 java5 构建,则需要使用 java5 源级别。
你真的需要使用 Java6 源代码级别吗?如果您需要使用 Java6 API 中的某些东西,那么当您尝试运行这些构建时,将无法为 Java5 生成构建。如果您不需要使用 Java6 API,那么您也不需要使用 Java6 源代码兼容性。
出现问题的部分原因不仅是类格式发生了变化,而且 Java 6 添加了/与 Java 5 不同的 API。因此,您可能无意中使用了这些 API,然后当您在 Java 上部署时,实现将丢失5.
如果 Java 5 对您很重要,我会针对 Java 5 SDK 进行开发和构建。这是知道一切都会按预期工作的唯一可靠方法。
我(曾经)设计了一个跨 SDK 兼容的项目。它需要两个构建(每个 SDK 一个),并且代码必须根据使用的 SDK 有条件地加载所需的 API 类。我真的一点都不建议!
注意:您提到了 Mac。Java 6 可用于 Mac(不确定这是否是您提到 Mac 的原因)
另请参阅指向类似(较旧)问题的此线程:
“Java 理论与实践:在早期 JDK 中使用 Java 5 语言功能”:
除非您使用某种外部工具将 Java 6 字节码转换为与 Java 1.5 兼容的字节码,否则您实际上无法将类合规性设置为 1.5 并将源代码合规性设置为 6.0。
无法完成。
如果不需要 Java 6,请使用 Java 5 源代码级别。
如果你需要 Java 6,你不能只用 Java 5 编译它。
我以前也这样做,但忘记了如何:(。我在下面找到了这个链接,它似乎显示了一种方法,这可能是我过去在自己的项目中所做的。然后你将你的 eclipse 类和源版本设置为 1.6在构建它时使用 Ant 构建来获得正确的类版本。
来自: http: //www.masutti.ch/eel/(已在上一个答案中链接)
更新:在 Eclipse 3.2 中,这必须在你的 ant 脚本的 javac 行中看起来不同,像这样设置源和目标
javac (...) source="1.5" target="jsr14" (...)
我用一个简单的项目尝试了它,它在 eclipse 3.4 中对我有用。您可以使用 File->export->General->Ant Buildfiles 为简单项目自动生成 build.xml。然后我只是调整了这一行:
'属性名称="目标" 值="jsr14"/>
并使其重建。
然而,它很容易出错。我必须将我所有的 'System.out.printf' 更改为 'System.out.print' ,否则它只会引发异常。您可以通过将源合规性设置为 1.4 来检查您的源,然后修复明显的东西(如 printfs),然后再次将其更改回来。
实际上,事实证明,您可以完全按照 OP 想要的方式执行操作,只是不能在 Eclipse IDE 中执行。您必须手动编辑文件org.eclipse.jdt.core.compiler.codegen.targetPlatform
中的属性project>settings folder>org.eclipse.jdt.core.prefs
。
当然,当你这样做时,你可能会得到一些非常糟糕的结果,正如其他海报所暗示的那样,所以如果有的话,请小心地做这种事情。
有关更多信息,请参阅此。