JDK1.5出来多年了(2004年10月正式发行),就连6.0正式版在 http://java.sun.com
上
已是赫然在目,紧跟着的各应用服务器和 Java IDE 厂商的都准备就绪.
可是相信很多开发者跟我一样却碍于公司用的是老版本的应用服务器,如WebSphere Application
Server,,WebLogic等只能支持到1.4的JDK,要升级应用服务器成本和风险都有担心,所以项目中只能用1.4
的JDK,一直无法体验到 JDK 1.5 的新特性带来的便利.
有些同事机器里一直还是躺着 JDK
1.4,我可能比他们好一点就是直接装了一个 JDK 1.5,然后在 Java IDE 中设置编译器的 Compiler compliance
level为 1.4(实质就是javac –target 1.4).这样避免了用JDK1.5编译的Class
放在1.4的JVM中运行出现49.0的字节码版本太高的错误,这样做只不是50步和100步的差距,照例用不了JDK1.5 的新特性.
我一直在探索:能不能使用JDK1.5的特性,然后让生成的字节码能在1.4的JVM下运行.如是果是仅仅换掉应用服务所用的JDK恐怕是会出很多问题的.
也算是功夫不负有心人啊,时至今日终于在网上找着了一个叫做 Retrotranslator 的工具,开源的,在 SourceForge http://sourceforge.net/projects/retrotranslator
,当前版本是1.2.1.这个工具正好能满足我的需求.进到那个下载页面,你只要下载 Retrotranslator-1.2.1-bin.zip
,其中包含了
retrotranslator-runtime-1.1.1-bundle.jar 字节码转换之后,运行时需要这个包来支持
retrotranslator-transformer-1.2.1-bundle.jar 转换字节码用,如用命令转换或用ant来转换需要这个包
而且还有一个 backport-util-concurrent-3.0.jar 大概是用新的并发机制运行时需要依赖这个包
Retrotranslator实质上是一个基于ASM 框架的字节码转换工具,如果要看它详细的使用帮助,请见页面 http://retrotranslator.sourceforge.net/
.
使用 Retrotranslator 可以让你使用的JDK1.5的特征有泛型、注解、泛型和注解的反射、枚举、自动装/拆箱、增强的循环、变参、协变式返回类型、格式化输出、静态引入、新的并发机制、增强的集合框架。(见What Java 5 features are supported?
)
还能使用新的类和新的方法,如 StringBuilder 等,见What Java 5 classes and methods are supported?
使用方式:
1. 命令行下转换用JDK1.5的编译的classes文件
2. 用Ant或Maven自动化转换用JDK1.5的编译的classes文件,Retrotranslator提供了对Ant和Maven的支持。
3. 运行程序时加载类时即时转换换用JDK1.5的编译的类打成的jar包
4. 作为 IntelliJ IDEA的一个插件使用,可惜现在还没有Eclipse的插件,只能是期盼着。
下面只介绍如何用ANT方式来转换用JDK1.5的编译的classes文件,让它们能运行在1.4的JVM中。步骤如下:
1. 用1.5的JDK编译好你的类,比如编译在c:\workspace\unmi\WEB-INF\classes下。用Ant或是IDE帮你编译好。
2. 把
retrotranslator-transformer-1.2.1-bundle.jar拷入到
$ANT_HOME/lib中,如果是在Eclipse中运行Ant Build文件,你需要设置
Window->Preferences->Ant-Runtime然后Add External
JARSs…把retrotranslator-transformer-1.2.1-bundle.jar加进来。
3. 上面准备做好了,就要开始用 Retrotranslator来转换你的字节码了。转换部分的Ant Build的target像下面这么写:
<!-- 用 Retrotranslator 把上面编译的Class文件转换成JVM1.4的Class文件-->
<target name="translate">
<taskdef name="retrotranslator"
classname="net.sf.retrotranslator.transformer.RetrotranslatorTask" />
<retrotranslator
destdir="c:\workspace\unmi\WEB-INF\classes" verify="true"
srcdir="c:\workspace\unmi\WEB-INF\classes">
<!-- 项目中用到的包或类 -->
<classpath refid="classpath"/>
<!-- 1.4JDK的运行时包 -->
<classpath location="c:/jdk1.4/jre/lib/rt.jar"/>
</retrotranslator>
</target>
4. 注意到上面destdir和srcdir都写成了一样的,我是让转换后的类直接把原来的类覆盖了,你可已把destdir设置为别的目录。
5. 最
后就是运行了,你需要事先把retrotranslator-runtime-1.1.1-bundle.jar和backport-util-
concurrent-3.0.jar配置在你的classpath中,比如是WEB应用程序,把它们拷到WEB-INF\lib中就行了。
比如,你写的是一个企业应用程序或者WEB程序,你只需要在打EAR或WAR包之前作以上的转换就行了。
另
外,对于在JSP中用了JDK1.5的特性,就稍稍有点麻烦了,先要用特定于应用服务器的JSP编译器编译好JSP文件,在用
Retrotranslator 转换生成的 JSP 对应的class文件。如果中途对JSP文件有改动,我们不仅要编译并转换JSP
对应的class文件,然后覆盖掉服务器上的那个JSP对应的class文件,还要覆盖服务器上的那个JSP文件。
通常我们都不会对JSP文件预编译的。
所以我们的口号是:尽量不在JSP文件中写JAVA代码,写了也不要用JDK1.5的新特性,即使有复杂的东西也可以交给自定义标签处理。
比如struts标签
<logic:equal name="myBean" property="amount" value="1">……</logic:equal>
不管amount是Integer还是 int 都无妨
再比如
<logic:iterate name="myBeanList" id="myBean">
<bean:write name="myBean" property="amount"/>
</logic:iterate>
不管myBeanList是否是用的泛型,都能够正确取出数据来。如果要求严格点在给<logic:iterate标签加上一个type属性指明所存储的数据类型。
当然不是正统上的东西还是会有一些局限性的,具体参看:What are the limitations?,
如果在项目中遇到问题,我想总会有别的解决问道的。
借助于 Retrotranslator,我的一个项目就是用JDK1.5的特性写的,用了泛型、增强的循环、自动装/拆箱等特新,部署在WAS5.1下运行,至今状况十分良好。
其他类似工具:
1. Retroweaver
2. Declawer
3. JBossRetro
参考:
1. Retrotranslator ReadMe.html
由于在 Eclipse 没有相应的插件,可考虑修改在 JDK 1.5 中使用 javac api 调用 Retrotranslator 打造自己的 java 编译器。
后
记:retrotranslator 的 destdir 属性可以省略,这时候就与 srcdir 同一目录,转换后的 class 覆盖原来的
class。并且 srcdir 可以指定到包目录中,如
srcdir="c:\workspace\unmi\WEB-INF\classes\com\unmi\utils",这时候只转换
com.unmi.utils 包中的 class 文件。
原文地址:http://www.blogjava.net/Unmi/articles/124166.html
分享到:
相关推荐
标题中的“利用Retrotranslator将Jdk1.5项目迁移到1.4”是指使用Retrotranslator工具将基于Java 1.5版本的代码库转换为兼容Java 1.4的代码。这是因为某些环境或者旧系统可能只支持早期版本的Java,而新项目可能已经...
在Java开发过程中,时常会遇到跨版本的问题,尤其是在旧版JDK环境中运行新版JDK编译的代码。这里我们讨论的焦点是“JDK1.5环境下编译的jar包在JDK1.4环境下运行”所遇到的问题,具体表现为“Unsupported major.minor...
以上这些特性极大地增强了Java语言的功能和表现力,让Java开发者能够编写出更加安全、可维护的代码。JDK1.5的发布不仅提升了开发效率,也为后续的Java版本奠定了坚实的基础。学习和理解这些新特性,对于任何Java...
在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows操作系统的64位版本。JDK是开发和运行Java应用程序、Web应用程序和分布式系统的基础工具集合。它是Java平台的核心组成...
综上所述,JDK1.5是Java发展历程中的一个重要里程碑,它的特性改进了编程体验,提升了代码质量和运行效率。而64位Windows版的JDK1.5,则是针对Windows用户的一种优化选择,满足了开发者在64位环境下的需求。文件"jdk...
在探讨如何在操作系统中同时安装了JDK1.4和JDK1.5的情况下更改环境变量等设置之前,我们先来了解一下JDK的基本概念及其版本更迭的重要性。 ### JDK简介 JDK(Java Development Kit)是Sun Microsystems为Java...
总结来说,JDK1.5是Java发展历程中的一个重要节点,它的泛型、自动装箱/拆箱、枚举、变长参数和增强for循环等特性极大地提升了开发效率和代码质量。同时,了解不同操作系统对应的JDK版本是进行Java开发的基础知识。...
Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...
在JDK1.5中,开发者可以在方法签名中使用省略号(...)表示可变参数。这允许方法接受任意数量的相同类型的参数,如: ```java public void printNumbers(int... nums) { // 代码块 } ``` 这个方法可以接收一个或多...
在JDK 1.4中,调用Math.sqrt()需要写成`java.lang.Math.sqrt()`,但在JDK 1.5之后,可以使用`import static java.lang.Math.sqrt;`然后直接调用`sqrt()`。 5. **变长参数(Variable-Length Arguments)** - 变长...
2. **泛型**:泛型是1.5最重要的新特性之一,它允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。泛型可以限制集合元素的类型,避免了类型转换错误。 3. **枚举类(enum)**:之前的Java中,...
泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...
### JDK 1.5 新特性详解 #### 泛型编程 **定义与作用:** 泛型编程是 Java 1.5 引入的一项重要特性,它允许开发者在编译时进行类型安全检查,从而避免了运行时可能出现的类型转换异常。通过在编译阶段检查类型安全...
泛型是JDK 1.5最重要的特性之一,它允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和可读性。通过泛型,可以确保容器(如ArrayList、HashMap)中的元素类型在编译时就被限定,避免了运行时的类型转换...
4. **变量赋值检查**:编译器在JDK 1.5中增加了空指针检查,如果变量未初始化就使用,编译器会报错,增强了代码的健壮性。 5. **for-each循环**:新的增强for循环(也称为foreach循环)让遍历数组和集合变得更加...
泛型是JDK 1.5引入的最显著的特性之一,允许在类、接口和方法中使用类型参数,增强了类型安全性和代码重用性。泛型可以防止在运行时出现ClassCastException,并且在编译阶段就能捕获类型错误。 2. **自动装箱与...
标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...
这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...