感谢您的回答。这是所有相关答案和我自己的研究的摘要。
更改字节码:Retros
这是通过“复古”工具完成的:Retrotranslator,Retroweaver和JBossRetro。Retrotranslator似乎是其中最成熟,最活跃的工具。这些工具扫描所有类并更改字节码以删除Java
5和6功能。支持许多Java5功能,其中一些功能是通过使用第三方反向端口库实现的。此选项最受欢迎,并且得到了用户的积极反馈。实验表明它可以按预期工作。请参阅有关developerWorks的简短概述。
专业人士:您可以完全使用Java 5开发,构建模块和各种JAR。最后,您只需将所有类转换为Java
1.4并打包EAR。使用Retrotranslator的Maven集成(
org.prehaus.mojo:retrotranslator-maven-plugin)可以轻松完成此操作。
缺点:保守的环境不允许部署更改的字节码。追溯结果对任何编码人员都不可见,因此无法通过。第二个问题是恐惧:可能存在一些隐秘的生产问题,而追溯代码可能是对此负有责任的另一步骤。应用服务器供应商可能会由于字节码更改而拒绝帮助。因此,没有人愿意承担将其用于生产的责任。因为这是一个政策问题,而不是技术问题,所以我认为没有解决方案。它发生在我们身上,所以我正在寻找其他选择:-(
将Java5编译为Java 1.4:jsr14
有一个不受支持的选项,
javac -source 1.5 and -target jsr14它将Java5源代码编译为有效的Java
1.4字节码。无论如何,大多数功能(如varargs或Extended
for循环)都由编译器翻译。泛型和注释被剥离。不支持枚举,我也不了解自动装箱,因为这些
valueOf方法大多数是在Java5中引入的。
缺点:仅翻译字节码,不改变库用法。因此,您必须注意不要使用Java5特定的API(但可以使用Backports)。此外,您还必须同时构建所有模块,因为在开发时,您可能希望Java5代码具有泛型和注释信息。因此,您必须从头开始为Java
1.4生产构建整个项目。
将源代码更改回Java 1.4:Declawer
优点:生成的源可用并且可以查看。在最坏的情况下,可以在此源中进行修复。没有“魔术”,因为源是有效的Java。有些人甚至使用JAD(Java反编译器)再次获得Java
1.4源。如果使用调试信息进行编译并且不使用内部类,则Jad可读的输出是可读的。
缺点:与相似
-target jsr14,您需要在部署中执行额外的步骤。库也有同样的问题。
将Source更改回Java 1.4:手工完成
一些答案建议手工完成。对于自动的重复构建过程,这当然没有用,但是对于一次性更改,这是合理的。只是自动化一切。也许看一下Antlr来创建一个本地转换工具。
向后移植的库:
问题是Java5还提供了新的库,这些库在较旧的JRE中不可用,请参阅相关问题。幸运的是,有几个向后移植的库可以为您提供Java5的某些功能,但是不能模拟语言特性,例如泛型。
- 注释,在TSS上讨论
- 同时
- com.sun.net.httpserver(Java 6至5)
- Gif编写(Java 6至5)
- 开始您自己的backport项目;-)
- 您可以从JDK或其他库中复制所需的类,但是很可能它们与其他类相关。
在Java 1.4代码中模拟Java5功能:
我在考虑可能要做的一些事情,以使您的生活更轻松并仍然使用Java 1.4。最重要的功能是类型安全集合,以下是一些建议:
- 可以使用某些模板来创建自己的类型安全容器,而不是使用泛型。
- 添加一个类型安全的迭代器(不再是迭代器)。
- 添加
asList
允许1,2,...,n
参数和参数数组的方法(以模拟varargs)。 - 用于varargs的方法(将
1,...,n
参数转换为数组),valueOf
可以放在一些帮助器类中。



