8

我们一直坚持使用 Java2SE v1.4 直到 2010 年底。这真的很糟糕,但我们无能为力。我们现在必须使用哪些新功能?我可以想到几种方法,例如

  • 更改字节码,例如使用RetrotranslatorRetroweaver

  • 库的反向移植,例如Concurrent Backport,但这对泛型没有帮助。

  • 模拟 Java 5 功能,例如检查集合、带有辅助方法的可变参数等。

  • 通过预编译更改源代码,在最终编译之前剥离所有 1.5 的东西,例如使用Declawer可以做到这一点。

我最感兴趣的是在生产环境中使用 Weblogic 和“真实”东西的非常积极的体验。

4

5 回答 5

11

感谢您的回答。这是所有相关答案和我自己的研究的摘要。

更改字节码:Retros
这是由“retro”工具完成的:RetrotranslatorRetroweaverJBossRetro。Retrotranslator 似乎是其中最成熟和最活跃的工具。这些工具扫描所有类并更改字节码以删除 Java 5 和 6 功能。支持许多 Java5 功能,其中一些通过使用 3rd 方反向移植库。此选项最受欢迎,用户也有一些积极的反馈。实验表明它按预期工作。请参阅developerworks的简短概述。

优点:您可以完全使用 Java 5 进行开发、构建模块和各种 JAR。最后,您只需将所有类转换为 Java 1.4 并打包您的 EAR。这可以通过 Retrotranslator 的 Maven 集成 ( org.codehaus.mojo:retrotranslator-maven-plugin) 轻松完成。

缺点:保守的环境不允许部署更改的字节码。任何编码人员都看不到追溯步骤的结果,因此无法获得批准。第二个问题是恐惧:可能存在一些神秘的生产问题,而追溯代码是另一个可能受到指责的步骤。应用服务器供应商可能会因为更改字节码而拒绝帮助。所以没有人愿意负责在生产中使用它。由于这是一个政治问题而不是技术问题,所以我认为没有解决方案。它发生在我们身上,所以我正在寻找更多的选择:-(

将 Java5 编译为 Java 1.4:jsr14
有一个不受支持的选项,javac -source 1.5 and -target jsr14它将 Java5 源代码编译为有效的 Java 1.4 字节码。无论如何,大多数功能(如 varargs 或扩展 for 循环)都由编译器翻译。泛型和注释被剥离。不支持枚举,我也不知道自动装箱,因为这些valueOf方法大多是在 Java5 中引入的。

缺点:只翻​​译字节码,库使用没有改变。因此,您必须小心不要使用 Java5 特定的 API(但可以使用 Backports)。此外,您必须同时构建所有模块,因为对于开发时间,您可能需要具有通用和注释信息的 Java5 代码。因此,您必须从头开始构建整个项目以用于 Java 1.4 生产。

将源代码更改回 Java 1.4:Declawer
正如在相关问题中所回答的那样,有Declawer是一个编译器扩展,适用于泛型和可变参数,但不适用于增强的 for 循环或自动装箱。生成的源“有点时髦,但还不错”。

优点:生成的源代码可用并且可以查看。在最坏的情况下,可以在此源中进行修复。没有“魔法”,因为源代码是有效的 Java。有些人甚至使用 JAD(Java 反编译器)来重新获取 Java 1.4 源代码。如果您使用调试信息进行编译并且不使用内部类,则 Jad readable 的输出是可读的。

缺点:与 类似-target jsr14,您需要在部署中增加一个步骤。图书馆也有同样的问题。

将源更改回 Java 1.4:手动
有几个答案建议手动进行。对于一个自动的、重复的构建过程,这当然没有用,但对于一次性更改它是合理的。只是自动化可能的事情。也许看看 Antlr 来创建一个本土的转换工具。

Backported Libraries:
问题是,Java5 还提供了新的库,这些库在旧的 JRE 中不可用,请参阅相关问题。幸运的是,有几个向后移植的库可以为您提供 Java5 的一些功能,但不能模拟语言特性,例如泛型。

在 Java 1.4 代码中模拟 Java5 功能:
我正在考虑您可能会做的一些事情,以使您的生活更轻松,并且仍然使用 Java 1.4。最重要的特性是类型安全的集合,这里有一些想法:

  • 您可以使用一些模板创建自己的类型安全容器,而不是使用泛型。
  • 添加一个类型安全的迭代器(不再是迭代器)。
  • 添加asList允许1,2,...,n参数和它们的数组的方法(以模拟可变参数)。
  • 可变参数(将1,...,n参数转换为数组)的方法,valueOf可以放在一些帮助类中。
于 2009-07-08T15:44:35.357 回答
2

源代码预编译,在最终编译和部署之前剥离所有 1.5 的东西。有没有可以做到这一点的工具?

是的。它们被称为 Retrotranslator 或 Retroweaver。除了泛型(无论如何它只是为了编译器的缘故而存在),你不能简单地“剥离 1.5 的东西”。枚举(也许还有其他一些特性)必须用功能等效的代码替换。这正是这些工具的作用。

于 2009-06-18T09:28:15.653 回答
2

您可以使用 JDK 1.5 功能进行编码,并在编译时以 JDK 1.4 为目标。查看可用的 Javac 选项。但是,大多数库现在都使用 JDK 1.5 代码,因此您将被旧库卡住。

于 2009-06-18T14:05:29.760 回答
0

值得注意的是,虽然 Java 1.4 已经 EOL 一段时间了。Java 5.0 将于 2009 年 10 月 8 日 EOL。如果有人向您承诺到 2010 年 Java 5.0,我会问为什么?

于 2009-06-18T18:44:19.900 回答
0

要在 java 1.4 中模拟注释,您可以使用http://xdoclet.sourceforge.net/xdoclet/index.html

于 2009-07-08T15:41:39.637 回答