Retrotranslator -- JDK1.5->1.4降级工具

赵同
2023-12-01

老掉牙的jdk1.4还没有走出历史的舞台。这几天尝试着将jdk1.5编写的程序使用Retrotranslator转为jdk1.4可使用的版本,结果不是太理想,在转spring3.0.5的一些包的时候出现了一些问题:如:

java.lang.system.getenv
java.lang.thread.remove

这两个java的api在使用spring的过程中会报错,提示不存在该方法。


网上资料看似很多,但是真正写清楚的不多,这里分享一下我的学习过程。

----------------------------------------------------------------------------

下载最新版本Retrotranslator-1.2.9-bin.zip。可以解压后看readme.html文件,里边的教程比较好。

使用的包:

  • retrotranslator-transformer-1.2.9.jar  用于转换class和jar的包;
  • retrotranslator-runtime-1.2.9.jar 放到项目的lib文件夹中;
  • backport-util-concurrent-3.1.jar 放到项目的lib文件夹中;
我采用的转换方式是Ant脚本方式:
  • 转换class
    <target name="jdk14src" depends="jdk14jar">  
        <retrotranslator destdir="${Retrotranslator.dist.dir}/class" verify="true">  
            <!-- 包含class文件,并换成1.4的class文件-->
            <fileset dir="${Retrotranslator.class.dir}" includes="**/*.class"/>  
        	<classpath location="${jdk14_home}/jre/lib/rt.jar"/>
        	<classpath refid="compile.classpath1.4"/>  
        </retrotranslator>  
    </target>  
  • 转换jar
			<retrotranslator srcjar="${Retrotranslator.jar.dir}/@{jarname}.jar" destjar="${Retrotranslator.dist.dir}/lib/@{jarname}-jdk14.jar" verify="true" advanced="true" failonwarning="Off">
				<classpath location="${jdk14_home}/jre/lib/rt.jar"/>
				<classpath refid="compile.classpath"/>
			</retrotranslator>
说明一下:
  1. verify属性:特别重要,设置为true的话,他会校验转换的jar或class中用到的jdk-api是否支持转换,如不支持会提示
  2. 转换jar的时候,不支持批量转换,所以,需要使用宏操作:
    <!-- 对jar包进行转换 -->
    <macrodef name="jdk14jar">
		<attribute name="jarname"/>
		<sequential>
			<retrotranslator srcjar="${Retrotranslator.jar.dir}/@{jarname}.jar" destjar="${Retrotranslator.dist.dir}/lib/@{jarname}-jdk14.jar" verify="true" advanced="true" failonwarning="Off">
				<classpath location="${jdk14_home}/jre/lib/rt.jar"/>
				<classpath refid="compile.classpath"/>
			</retrotranslator>
		</sequential>
	</macrodef>
使用的时候如此调用:
 <!-- 批量对jar包进行转换 -->
    <target name="jdk14jar" depends="init">  
        <!-- 直接把jar文件转换成1.4的jar文件-->
    	<jdk14jar jarname="commons-lang-2.5"/>
    	<jdk14jar jarname="commons-logging-1.0.4"/>
    	<jdk14jar jarname="commons-pool-1.5.4"/>
    	<jdk14jar jarname="freemarker"/>
    </target>
-------------------------------------------------------------------------------------------
另外,使用Ant打jar的话,有三种方式,这位同行说的比较清楚 http://blog.csdn.net/caiqcong/article/details/7618582,我采用的是第三种方法。
<!-- 打包成可执行jar -->
	<target name="jar">
		<jar basedir="${Retrotranslator.dist.dir}/class" destfile="${Retrotranslator.dist.dir}/CreateEmailFiles.jar">
			<manifest>
				<attribute name="Main-Class" value="org.mice.tax.CreateTaxEmailIndex"/>
				<attribute name="Class-Path" value=". lib/backport-util-concurrent-3.1.jar lib/retrotranslator-runtime-1.2.9.jar lib/commons-lang-2.5.jar lib/commons-logging-1.0.4.jar lib/commons-pool-1.5.4.jar lib/freemarker.jar lib/ldapbp-1.0.jar lib/log4j-1.2.9.jar lib/spring.jar lib/spring-ldap.jar lib/xercesImpl.jar lib/xml-apis.jar"/>
			</manifest>
		</jar>
	</target>

其他配置:
    <!-- 配置文件路径 -->
    <property file="build-dist.properties"/> 
 <!-- 所有jar包路径 -->
    <path id="compile.classpath">  
        <fileset dir="${Retrotranslator.dir}">  
            <include name="**/*.jar"/>  
        </fileset>  
    </path>
	<!-- 所有新生成的1.4版本的jar包路径 -->
    <path id="compile.classpath1.4">  
        <fileset dir="${Retrotranslator.dist.dir}/lib">  
            <include name="**/*.jar"/>  
        </fileset>
    </path> 
    <!-- 初始化任务,定义任务名称 -->
    <target name="init">  
        <mkdir dir="${Retrotranslator.dist.dir}"/>  
    	<mkdir dir="${Retrotranslator.dist.dir}/lib"/>  
    	<mkdir dir="${Retrotranslator.dist.dir}/class"/>  
        <taskdef name="retrotranslator" classpathref="compile.classpath" classname="net.sf.retrotranslator.transformer.RetrotranslatorTask" />  
    </target>



 类似资料: