我们一直使用Java2SE v1.4到2010年底。这真的很恶心,但我们无法控制。我们现在有哪些选择来使用一些新特性呢?我可以想出几种方法
我最感兴趣的是在使用Weblogic和“真正”东西的生产环境中使用它的非常积极的经验。
发布于 2009-07-08 15:44:35
谢谢你的回答。这是所有相关答案的总结和我自己的研究。
更改字节码: Retros
这是由“复古”-tools:反向翻译器、回纬器和JBossRetro完成的。回传翻译似乎是其中最成熟、最活跃的工具。这些工具扫描所有类并更改字节码以删除Java 5和6特性。许多Java5特性都受到支持,有些是通过使用第三方后端库来支持的。这个选项是最流行的,并有一些积极的反馈用户。实验表明,它是正常工作的。请参阅关于developerworks的简要概述。
支持:您可以完全使用Java 5进行开发,构建模块和各种JAR。最后,您只需将所有类转换为Java1.4并打包您的EAR。这很容易用Retrotranslator的Maven集成(org.codehaus.mojo:retrotranslator-maven-plugin)来完成。
Con:保守的环境不允许部署更改的字节码。追溯步骤的结果对任何编码器都是不可见的,不能被批准。第二个问题是恐惧:可能会有一些神秘的生产问题,而复古代码是另一个可能被指责的步骤。应用服务器供应商可能会因为字节码的改变而拒绝帮助。所以没有人愿意承担在生产中使用它的责任。这与其说是技术问题,不如说是警察问题,所以我看不出有什么解决办法。这件事发生在我们身上,所以我正在寻找更多的选择:
将Java5编译为Java1.4: jsr14
有一个不受支持的选项javac -source 1.5 and -target jsr14,它将Java5源代码编译为有效的Java1.4字节码。大多数特性,如varargs或extended循环,反正都是由编译器翻译的。泛型和注释被剥离。Enum不受支持,我也不知道自动装箱,因为valueOf方法大多是在Java5中引入的。
Con:只有字节码被翻译,库的使用没有改变。因此,您必须小心不要使用特定于Java5的API(但可以使用Backport)。此外,您还必须同时构建所有模块,因为在开发过程中,您可能希望Java5代码具有通用和注释信息。因此,为了Java1.4的生产,您必须从头开始构建整个项目。
将源代码更改为Java1.4: Declawer
正如在相关问题中回答的那样,有一个编译器扩展德劳尔,它适用于泛型和varargs,但不适用于增强的循环或自动装箱。生成的源“有点古怪,但不算太糟”。
Pro:生成的源是可用的,可以进行审查。在最坏的情况下,可以在这个源中进行修复。没有“魔力”,因为源代码是有效的Java。有些人甚至使用JAD (Java反编译器)再次获得Java1.4源代码。如果使用调试信息编译且不使用内部类,则Jad可读输出是可读的。
Con:与-target jsr14类似,您需要在部署中增加一个步骤。图书馆也有同样的问题。
将源代码更改为Java1.4:手动
有几个答案建议用手做。对于一个自动的、重复的构建过程来说,这当然不是有用的,但是对于一次性的更改来说,这是合理的。只需自动完成可能的事情。也许可以看看Antlr来创建一个本土的转换工具。
支持的图书馆:
问题是,Java5还提供了新的库,这些库在旧的JRE中是不可用的,请参阅相关问题。幸运的是,有几个支持移植的库为您提供了Java5的一些功能,但不能模拟语言特性,比如泛型。
在Java1.4代码中模拟Java5特性:
我在想一些事情,您可能会做一些事情,使您的生活更轻松,并且仍然停留在Java1.4中。最重要的特性是类型化收藏,以下是一些想法:
asList参数和数组的1,2,...,n方法(以模拟varargs)。1,...,n参数转换为数组)和valueOf的方法可以放在某些助手类中。发布于 2009-06-18 09:28:15
源代码预编译,在最终编译和部署之前,删除所有1.5的内容。有什么工具可以做到这一点吗?
是。他们叫回音翻译或Retroweaver。除了泛型(它只是为了编译器而存在)之外,您不能简单地“剥离1.5东西”。Enum(可能还有其他一些特性)必须用功能等效的代码来替换。这些工具就是这么做的。
发布于 2009-06-18 14:05:29
--您可以在编译时使用JDK1.5特性、和目标JDK1.4进行编码。请参阅可用的Javac选项。但是,大多数库现在都在使用JDK1.5代码,因此您将不得不使用旧的库。
https://stackoverflow.com/questions/1011706
复制相似问题