感谢您的回答。这是所有相关答案和我自己的研究的摘要。
更改字节码:Retros
这是由"retro"-tools: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 字节码。大多数功能,如
无论如何,编译器都会翻译可变参数或扩展 for 循环。泛型和注释被剥离。不支持枚举,我不知道
关于自动装箱,因为 valueOf 方法大多是在 Java5 中引入的。
Con:只翻译字节码,库的使用没有改变。因此,您必须小心不要使用 Java5 特定的 API(但可以使用 Backports)。
此外,您必须同时构建所有模块,因为在开发时您可能需要具有通用和注释信息的 Java5 代码。
因此,您必须从头开始构建整个项目以用于 Java 1.4 生产。
将源代码改回 Java 1.4:Declawer
正如在related question 中回答的那样,有Declawer,一个编译器扩展,适用于泛型和可变参数,但不适用于增强的 for 循环或
自动装箱。生成的源“有点时髦,但还不错”。
专业版:生成的源代码可用并且可以查看。在最坏的情况下,可以在此源中进行修复。没有“魔法”,因为源
是有效的 Java。有些人甚至使用 JAD(Java 反编译器)来重新获取 Java 1.4 源代码。如果使用调试编译,Jad readable 的输出是可读的
信息,不要使用内部类。
缺点:与-target jsr14 类似,您需要在部署中增加一个步骤。库也有同样的问题。
将源代码改回 Java 1.4:手动
几个答案建议手工完成。对于一个自动的、重复的构建过程,这当然没有用,但对于一次性更改它是
合理的。只是自动化可能的事情。也许看看 Antlr 创建一个本土的转换工具。
向后移植的库:
问题是,Java5 还提供了旧 JRE 中不可用的新库,请参阅related question。幸运的是有几个
向后移植的库,可为您提供 Java5 的一些功能,但不能模拟语言特性,如泛型。
在 Java 1.4 代码中模拟 Java5 功能:
我正在考虑您可能会做的一些事情,以使您的生活更轻松,并且仍然使用 Java 1.4。最重要的特性是类型安全的集合,
这里有一些想法:
- 您可以使用一些模板创建自己的类型安全容器,而不是使用泛型。
- 添加一个类型安全的迭代器(不再是迭代器)。
- 添加允许
1,2,...,n 参数的asList 方法及其数组(以模拟可变参数)。
- 可变参数(将
1,...,n 参数转换为数组)和valueOf 的方法可以放在一些帮助类中。