直到 2010 年底,我们仍坚持使用 Java2SE v1.4。这确实很恶心,但我们无能为力。我们现在必须有哪些选择来使用一些新功能?我可以想到几种方法,比如

  • 更改字节码,例如使用 逆向翻译器 或者 复古编织者.

  • 库的向后移植,例如 并发向后移植, ,但这对泛型没有帮助。

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

  • 通过预编译更改源代码,在最终编译之前剥离所有 1.5 内容,例如使用 断爪器 可以做到这一点。

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

有帮助吗?

解决方案

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

更改字节码:复古
这是由 “复古”工具: 逆向翻译器, 复古编织者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 某些功能,但无法模拟语言特性(如泛型)的反向移植库。

在 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top