将 Java 5/6 功能向后移植到 Java 1.4?
解决方案
感谢您的回答。这是所有相关答案和我自己的研究的摘要。
更改字节码:复古
这是由 “复古”工具: 逆向翻译器, 复古编织者 和 JBoss复古. 。逆转录器似乎是其中最成熟和活跃的工具。这些工具扫描所有类并更改字节码以删除 Java 5 和 6 功能。支持许多Java5功能,有些通过使用第三方Backport库。此选项最受欢迎,并且有一些用户的积极反馈。实验表明它正在按预期工作。请参阅以下内容的简短概述 开发者工作室.
专业人士:您可以完全使用 Java 5 进行开发、构建模块和所有类型的 JAR。最后,您只需将所有类转换为 Java 1.4 并打包您的 EAR。这可以通过 Retrotranslator 的 Maven 集成轻松完成(org.codehaus.mojo:retrotranslator-maven-plugin
).
缺点:保守的环境不允许部署更改的字节码。任何编码员都看不到回溯步骤的结果,也无法获得批准。第二个问题是恐惧:可能存在一些神秘的生产问题,而追溯代码是另一个可能被归咎于该问题的步骤。App-Server供应商可能会因更改字节码而拒绝帮助。因此没有人愿意承担在生产中使用它的责任。因为这是一个政治问题而不是技术问题,所以我没有解决方案。这发生在我们身上,所以我正在寻找更多选择:-(
将 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:断爪器
正如在a中回答的 相关问题, , 有 断爪器, 是一个编译器扩展,可用于泛型和 varargs,但不适用于增强的 for 循环或
自动泊车。生成的源代码“有点时髦,但还不错”。
专业人士:生成的源可用并且可以查看。在最坏的情况下,可以在此源中进行修复。没有 "魔法",因为源头 是有效的 Java。有些人甚至使用JAD(Java反编译器)重新获得Java 1.4源代码。如果使用调试程序编译,Jad readable 的输出是可读的 信息,不使用内部类。
缺点:如同 -target jsr14
, ,您需要在部署中执行额外的步骤。图书馆也有同样的问题。
将源更改回 Java 1.4:用手
有几个答案建议手动完成。对于自动、重复的构建过程来说,这当然没有什么用处,但对于一次性更改来说
合理。只需将可能的事情自动化即可。也许看看 Antlr 来创建一个本土的转换工具。
向后移植的库:
问题是,Java5 还附带了新的库,这些库在旧的 JRE 中不可用,请参阅 相关问题. 。幸运的是,有几种
为您提供 Java5 某些功能,但无法模拟语言特性(如泛型)的反向移植库。
- 注释, ,讨论于 TSS
- 同时
- com.sun.net.httpserver (Java 6 至 5)
- 动图写作 (Java 6 至 5)
- 开始您自己的向后移植项目;-)
- 您可能会从 JDK 或其他库复制所需的类,但它们很可能与其他类相关。
在 Java 1.4 代码中模拟 Java5 功能:
我正在考虑一些你可以做的事情来让你的生活更轻松,同时仍然使用 Java 1.4。最重要的功能是类型安全集合、
这里有一些想法:
- 您可以使用某些模板创建自己的类型安全容器,而不是使用泛型。
- 添加一个类型安全迭代器(不再是迭代器)。
- 添加
asList
允许的方法1,2,...,n
参数及其数组(以模拟可变参数)。 - 可变参数的方法(转换
1,...,n
数组的参数)和valueOf
可以放入一些辅助类中。
其他提示
源代码预编译、剥离 最终编译前的所有 1.5 版内容 和部署。是否有任何工具 哪一个可以做到这一点?
是的。它们被称为 Retrotranslator 或 Retroweaver。除了泛型(无论如何它只是为了编译器而存在)之外,您不能简单地“剥离 1.5 的东西”。枚举(也许还有其他一些功能)必须替换为功能等效的代码。这正是这些工具的作用。
您可以使用 JDK 1.5 功能进行编码 并在编译时以 JDK 1.4 为目标。查看可用的 Javac 选项。但是,大多数库现在都使用 JDK 1.5 代码,因此您将不得不使用旧库。
值得注意的是,虽然 Java 1.4 已经 EOL 一段时间了。Java 5.0 将于 2009 年 10 月 8 日停产。如果有人向你承诺在 2010 年实现 Java 5.0,我会问为什么?!
要模拟 java 1.4 中的注释,您可以使用 http://xdoclet.sourceforge.net/xdoclet/index.html