之前有介绍过在NetBeans里面调式HotSpot,今天记录下怎么在IDEA里面调试Java编译器,也就是javac。

首先我们要先拿到javac的代码,它是在hotspot的子工程langtools里面,clone下来先,

hg clone http://hg.openjdk.java.net/jdk7u/jdk7u/langtools

然后找到javac的代码入口,com.sun.tools.javac.main.Main

为了偷懒我直接在这个类里面加了main方法,

   public static void main(String[] args) {
        Main compiler = new Main("javac");
        compiler.compile(args);
    }

接下来就是关键的设置调试运行的参数了,直接上图,

IDEA中调试Java编译器小结

在program arguments里面我们使用了-proc:only这个javac支持的option,使用了这个option不会生成class文件,暂时也不需要。而后面的com/sun/tools/javac/Main.java就是我们要编译的源文件,为了偷懒,again,我直接使用了原本工程里面的文件。

关于这个com/sun/tools/javac/Main.java有个坑必需得记录下,一开始我填的是com.sun.tools.javac.Main.java,然后运行的时候,不管我怎么改working directory,一直报file not found。最后我很机智的在com.sun.tools.javac.main.JavacOption.HiddenOption#process这个方法里面打了断点(这个方法会用new File来找到我们指定的源文件),并且evaluate了下new File(".")看下当前的目录到底是在哪,怎么会一直找不到要编译的源文件。最后发现当前目录就是设置的working directory,于是我把它改成了/home/blues/projects/langtools/src/share/classes(原来默认的是/home/blues/projects/langtools)。既然是用的new File,那么我们传进来的源文件路径应该就得手动用/来代替.了。改了下,果然没报错了,可以找到源文件了。接下来就可以好好调试,把玩Java编译器了。

Alright, have fun^_^

相关文章: