Java 1.4的Backport Java 5/6function?

我们一直坚持使用Java2SE v1.4直到2010年底。这真的很讨厌,但我们无法帮助它。 我们现在有哪些选项可以使用一些新function? 我可以想到几种方式

  • 更改字节码,例如使用Retrotranslator或Retroweaver 。

  • 库的后端 ,例如Concurrent Backport ,但这对于generics无效。

  • 模拟Java 5function,例如检查集合,带辅助方法的Varargs等。

  • 通过预编译更改源代码,在最终编译之前剥离所有1.5内容,例如使用Declawer可以执行此操作。

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

谢谢你的回答。 以下是所有相关答案和我自己的研究的摘要。

更改字节码:Retros
这是由“retro” -tools完成的: Retrotranslator , Retroweaver和JBossRetro 。 逆向转化器似乎是它们中最成熟和最活跃的工具。 这些工具扫描所有类并更改字节码以删除Java 5和6function。 支持许多Java5function,有些通过使用第三方反向端口库。 此选项最受欢迎,用户也会收到一些积极的反馈。 实验表明,它按预期工作。 查看developerworks的简短概述。

Pro:您可以完全使用Java 5开发,构建模块和所有类型的JAR。 最后,您只需将所有类转换为Java 1.4并打包您的EAR。 这可以通过Retrotranslator的Maven集成( org.codehaus.mojo:retrotranslator-maven-plugin )轻松完成。

Con:保守的环境不允许部署更改的字节码。 任何编码器都​​看不到后向步骤的结果,因此无法获得批准。 第二个问题是恐惧:可能存在一些神秘的生产问题,而复古代码是另一个可能被指责的步骤。 应用程序服务器供应商可能会因更改字节码而拒绝帮助。 因此,没有人愿意承担在生产中使用它的责任。 由于这是一个政治问题,而不是技术问题,所以我认为没有解决方案。 它发生在我们身上,所以我正在寻找更多选择:-(

将Java5编译为Java 1.4:jsr14
有一个不受支持的选项, javac -source 1.5 and -target jsr14 ,它将Java5源代码编译为有效的Java 1.4字节码。 无论如何,编译器会翻译大多数function,如varargs或extended for循环。 generics和注释被剥离。 不支持枚举,我不知道自动装箱,因为valueOf方法主要是在Java5中引入的。

Con:只翻译字节代码,不改变库使用。 所以你必须小心不要使用Java5特定的API(但可以使用Backports)。 此外,您必须同时构建所有模块,因为在开发时,您可能希望Java5代码具有通用和注释信息。 因此,您必须从头开始构建整个项目以用于Java 1.4生成。

将Source更改回Java 1.4:声明
正如在相关问题中所回答的那样, Declawer是一个编译器扩展,适用于generics和变量,但不适用于增强的循环或自动装箱。 生成的源“有点时髦,但不是太糟糕”。

Pro:生成的源可用,可以查看。 在最坏的情况下,可以在此源中进行修复。 没有“魔力”,因为源是有效的Java。 有些人甚至使用JAD(Java反编译器)再次获取Java 1.4源代码。 如果使用调试信息进行编译并且不使用内部类,则可读的Jad输出是可读的。

Con:与-target jsr14类似,您需要在部署中执行额外步骤。 库也有同样的问题。

将Source更改回Java 1.4:手动
几个答案建议手工完成。 对于自动重复构建过程,这当然没有用,但对于一次性更改,这是合理的。 只需实现可能的自动化。 也许看看Antlr创建一个自行开发的转换工具。

移植图书馆:
问题是,Java5还提供了旧版JRE中不可用的新库,请参阅相关问题 。 幸运的是,有几个向后移植的库提供了Java5的一些function,但无法模拟语言function,如generics。

  • 注释 ,在TSS讨论
  • 同时
  • com.sun.net.httpserver (Java 6到5)
  • Gif写作 (Java 6到5)
  • 开始你自己的backport项目;-)
  • 您可以从JDK或其他库中复制所需的类,但很可能它们与其他类相关。

在Java 1.4代码中模拟Java5function:
我正在考虑一些你可能会做的事情,让你的生活更轻松,并且仍然坚持使用Java 1.4。 最重要的function是类型安全的集合,这里有一些想法:

  • 您可以使用某些模板创建自己的类型安全容器,而不是使用generics。
  • 添加一个typesafe Iterator(不再是Iterator)。
  • 添加asList方法,允许1,2,...,n参数及其数组(模拟varargs)。
  • varargs(将1,...,n参数转换为数组)和valueOf方法可以放在一些辅助类中。

源代码预编译,在最终编译和部署之前剥离所有1.5内容。 有没有可以做到这一点的工具?

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

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

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

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