1 使用工具Retrotranslator
http://retrotranslator.sourceforge.net/
下载工具Retrotranslator-1.2.9-bin.zip,将其解压到E:\retrotranslator
2 工具介绍
Retrotranslator是一个Java字节码转换工具。它能够把用JDK1.5编译的Java Class转换成可运行在JVM1.4。支持的Java 5.0特性包括:泛型、注释、枚举、可变参数个数、自动装箱/拆箱、增强式的for循环、静态导入、并行工具(Concurrency Utilities)、增强的collections框架。
但是Retrotranslator只支持Java 5.0新特性,不支持Java 5.0里新的API
3 工具的一些限制
- The Java 5.0 memory model is not fully supported even with the syncvolatile and syncfinal options if the fields are being accessed via reflection.
- Only the classes, methods, and fields listed above should work and the other features, like formatted input, are not supported.
- The Java 1.4 compilers and applications performing bean introspection may fail to work correctly with covariant return types.
- The backported implementation of the Java 5.0 API is not interoperable with the original implementation.
- Reflection-based tools may be unable to discover the backported implementation of the Java 5.0 API.
- The Java 5.0 reflection methods may return incomplete information for dynamically generated classes.
- The constants inlined by a compiler and access modifiers are ignored during the verification.
4 转换内容分类
需要转换的内容分为2种:jar包和classes文件的文件
5 转换方式
5.1 命令行方式
5.1.1 降级class文件
将含有jdk1.5编译的class文件放到e:\retrotranslator\classes下,同时新建文件夹classes14,用于存放重新编译生成的1.4版本的class文件。
cmd进入到e:\retrotranslator下,然后执行
java -jar retrotranslator-transformer-1.1.9.jar -srcdir classes -destdir classes14
执行结果如下:
Processing 21 file(s) from classes to class14.
Transformed 14 file(s).
5.1.2 降级jar包
将含有jdk1.5版本class的jar包,放到e:\retrotranslator\lib下,同时新建lib14文件夹,用于存放新生成的jar包
cmd进入到e:\retrotranslator下,然后执行
java -jar retrotranslator-transformer-1.1.9.jar -srcjar lib/struts2-core-2.1.8.1.jar -destjar lib14/struts2-core-2.1.8.1-j14.jar
执行结果如下:
Processing 600 file(s) from lib\struts2-core-2.1.8.1.jar to lib14\struts2-core-2.1.8.1-j14.jar.
Transformed 413 file(s).
注意:
转换jar包,一次只能转换一个,class文件可以批量转换
5.2 其它转换方式
5.2.1 ant方式编译
编写build.xml文件,用ant编译,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project default="translate" name="pluto-project" basedir=".">
<target name="translate">
<path id="classpath">
<fileset dir="项目文件的lib文件夹所在位置" includes="**/*.jar"/>
</path>
<taskdef name="retrotranslator"
classname="net.sf.retrotranslator.transformer.RetrotranslatorTask" />
<retrotranslator
destdir="ant编译后生成文件的目录" verify="true"
srcdir="项目编译后classes文件夹所在目录">
<!-- 项目中用到的包或类 -->
<classpath refid="classpath"/>
<!-- 1.4JDK的运行时包 -->
<classpath location="jdk1.4.2安装目录/jre/lib/rt.jar"/>
</retrotranslator>
</target>
</project>