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

来源:互联网 发布:曜俊树x先导爱知h 编辑:程序博客网 时间:2024/06/13 22:12

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

java.lang.system.getenvjava.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>



原创粉丝点击