【问题标题】:Backport Java 5/6 features to Java 1.4?将 Java 5/6 功能反向移植到 Java 1.4?
【发布时间】:2009-06-18 09:24:22
【问题描述】:

在 2010 年底之前,我们一直使用 Java2SE v1.4。这真的很糟糕,但我们无能为力。我们现在必须使用哪些新功能?我可以想到几种方法,例如

  • 更改字节码,例如使用RetrotranslatorRetroweaver

  • 库的反向移植,例如Concurrent Backport,但这对泛型没有帮助。

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

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

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

【问题讨论】:

  • 真的很挑剔...从来没有 Java 4,它是 Java 2 版本 1.4。
  • 是的,因为 Sun 的营销名称是合乎逻辑的。
  • 当您升级时,请确保它没有升级到 Java 5.0,因为它已经停产一年了。升级是有代价的,但升级失败也是有代价的。
  • Sun 的营销名称有其自身的逻辑,它们只是与为向后兼容而保留的内部名称不匹配,只需查看 Windows 版本名称/编号即可。十年前我们有 Windows 2000,现在我们有 Windows 7。

标签: java java1.4 backport


【解决方案1】:

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

更改字节码:Retros
这是由"retro"-toolsRetrotranslatorRetroweaverJBossRetro 完成的。 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 的方法可以放在一些帮助类中。

【讨论】:

  • 从头开始编译整个项目以用于 Java 1.4 生产应由您的构建服务器处理。
  • 其中大部分现在已经过时了。是否有 6->5 的等价物?
  • Retrotranslator 应该可以做到 6->5。我用 HSqlDB 2 尝试过。不幸的是它不能处理新的 java.sql 类,所以它失败了。但是,如果您不使用任何 Java 6 API,请尝试一下。
  • @Peter Kofler 相关问题和声明链接已损坏。
【解决方案2】:

源代码预编译,剥离 最终编译前的所有 1.5 东西 和部署。有没有工具 哪个可以做到?

是的。它们被称为 Retrotranslator 或 Retroweaver。除了泛型(无论如何它只是为了编译器的缘故而存在),你不能简单地“剥离 1.5 的东西”。枚举(可能还有其他一些特性)必须用功能等效的代码替换。这正是这些工具的作用。

【讨论】:

  • Retrotranslator 或 Retroweaver 更改上面列出的字节码。 es 我同意,并非所有功能都可以使用。泛型本身已经是一个巨大的胜利。
【解决方案3】:

您可以使用 JDK 1.5 功能进行编码,并在编译时以 JDK 1.4 为目标。查看可用的 Javac 选项。但是,现在大多数库都使用 JDK 1.5 代码,因此您将被旧库卡住。

【讨论】:

  • 我可能弄错了,但是针对较旧的源级别(在本例中为 1.4)会限制您仅使用该源级别中的功能。如果我错了,请纠正我。也许我们指的是不同的设置,您能否在答案中添加更多细节?
  • 我也被告知过,但我无法让它发挥作用。通常 Source=1.5 在 Eclipse 中需要 Target=1.5,对于普通 Sun 的 javac 在命令行中。
  • 你可以使用标志-target jsr14
【解决方案4】:

值得注意的是,虽然 Java 1.4 已经 EOL 一段时间了。 Java 5.0 将于 2009 年 10 月 8 日 EOL。如果有人向您承诺到 2010 年 Java 5.0,我会问为什么?!

【讨论】:

  • 在我工作的地方,我们仍然坚持使用 1.4,尽管承诺今年会切换。大公司比那些在科技公司幻想 EOL 日期的人想象的更保守,也更不愿意改变工作系统。或者,也许这些人只是知道上述公司也愿意为延长支持合同支付高额费用。
  • -1 因为它对我没有帮助。我知道我们应该升级,我是第一个对管理层这么说的人。
  • 我在一家拥有 65K 员工的公司工作,现在为一家拥有 139K 员工的公司工作,他们只是在所有 PC 上升级到 Java 6,所以我知道这可能会很慢,但 Java 5.0 已经可以用于5 年,Java 6 为 2.5 年。 Java 7 可能会在 2010 年推出。我不认为为大公司工作是一个很好的借口。如果您有使用受支持/当前版本的 Java 的商业案例,您应该制作一个。
  • EOL 是为了限制支持,而不是为了停止使用。我们仍然定期在 Java 1.4 上部署。
  • 有些人还在使用 Java 1.3。这并不是一个好主意。
【解决方案5】:

要在 java 1.4 中模拟注解,您可以使用 http://xdoclet.sourceforge.net/xdoclet/index.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2012-08-21
    • 2013-07-19
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多