感谢您的回答。这是所有相关答案和我自己的研究的摘要。
更改字节码:Retros
这是由“retro”工具完成的:Retrotranslator、Retroweaver和JBossRetro。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
可以放在一些帮助类中。