<?xml version="1.0"?>
<project name="project" default="build-debug-jre">
<description>
compile the JDK's source with debug option.
the JDK's rt.jar is compiled without debug information, which makes
debug ineffictive.
</description>
<property name="jdk.dir" value="d:/java/jdk1.5.0" />
<property name="jdk.src.dir" value="${jdk.dir}/src_fommated" />
<property name="jdk.class.dir" value="${jdk.dir}/classes" />
<target name="compile">
<mkdir dir="${jdk.class.dir}" />
<javac srcdir="${jdk.src.dir}"
destdir="${jdk.class.dir}"
debug="on"
source="1.5"
target="1.5"
memoryinitialsize="128m"
memorymaximumsize="512m"
fork="true"
>
<exclude name="com/sun/corba/se/spi/costransactions/TransactionService.java" />
<exclude name="com/sun/org/apache/xalan/internal/xsltc/trax/SmartTransformerFactoryImpl.java" />
<exclude name="com/sun/org/apache/xerces/internal/impl/xs/psvi/PSVIProvider.java" />
</javac>
</target>
<!-- we dont compile it in ant, instead, we build using eclipse -->
<target name="build-debug-jre">
<echo message="prepare directory ..." />
<delete dir="${jdk.dir}/debug-jre">
</delete>
<mkdir dir="${jdk.dir}/debug-jre" />
<echo message="copy standard jre" />
<copy todir="${jdk.dir}/debug-jre">
<fileset dir="${jdk.dir}/jre">
</fileset>
</copy>
<echo message="unzip old rt.jar" />
<mkdir dir="${jdk.dir}/debug-jre/rt_jar" />
<unzip dest="${jdk.dir}/debug-jre/rt_jar" src="${jdk.dir}/jre/lib/rt.jar">
</unzip>
<echo message="replace with new classes" />
<copy todir="${jdk.dir}/debug-jre/rt_jar" overwrite="true">
<fileset dir="${jdk.class.dir}" />
</copy>
<echo message="zip the rt.jar" />
<zip destfile="${jdk.dir}/debug-jre/lib/rt.jar" compress="false">
<fileset dir="${jdk.dir}/debug-jre/rt_jar" />
</zip>
<echo message="zip the src.jar to the jre directory" />
<zip destfile="${jdk.dir}/debug-jre/src.zip" compress="true">
<fileset dir="${jdk.src.dir}">
</fileset>
</zip>
<delete dir="${jdk.dir}/debug-jre/rt_jar">
</delete>
<echo message="Debug JRE build on ${jdk.dir}debug-jre" />
</target>
</project>
JDK 中的源代码是没有进行代码格式化的,在阅读时,有点费劲。此外,rt.jar 中不包含符号信息,在进行源代码调试时,一旦调试进入JDK的源代码,就无法进行察看变量等调试信息,很不方便进行调试工作。
为此,我对JDK的源代码进行如下处理,以方便进行阅读和调试:
- 使用eclipse IDE
- 新建 一个 java 项目
- 将 $JDK/src.zip 展开
- 在 eclipse IDE 中加入该源代码目录
- 编译可能会存在一些错误,在我的环境中,有接近10个编译错误,和上万个警告。(但还算非常顺利,证明了eclipse的JDT编译效率和质量都相当不错),这些报告的错误是本来就存在的,暂时忽略。
- 在eclipse中选择对包进行 Format。我把 Format Comments 选项去掉了,只格式化源代码。(由于eclipse中格式化智能对选定的包进行,要对整个项目进行格式化,可以选择整个源代码目录)
- 然后再打包一个 DEBUG-JRE 目录,与标准的 jre 目录/文件完全相同,但rt.jar、src.zip 已被替换,在eclipse中加入进来。
使用 eclipse 进行编译的class在实际运行中好像还是有些问题,会产生一些 IllegalAccessError的运行时错误,这个错误在我使用 javac 来进行编译时,总算是成功解决。 build.xml 为以后进行类似的工作提供了基础。
这样制作出来的JDK自然可以大大的加快学习JDK类库的速度和调试速度,起到事半功倍的作用。