(本文翻译自Core Java Technology Tech Tips for April 2007 )
起 初,标准java平台没有提供标准的接口来调用其自身的编译器生成Java字节码。在sun提供的平台实现上,用户可以通过一个非标准的 com.sun.tools.javac包来编译自己的代码。但是这个包并不能提供标准的、开放的编程借口。使用其他java平台实现的用户不能访问这个 类。使用java se 6和它的java compiler API (由JSR-199定义),你可以从自己的应用中直接调用javac编译工具。
有两种方法来使用这个工具。一种相对简单,另外一种要复杂一些但是允许你处理更多的要求。你可以首先使用简单的方法来编译下面的“hello world“程序:
public class Hello {
public static void main(String args[]) {
System.out.println("Hello, World");
}
}
为了从你的程序中调用java编译工具,你需要使用JavaCompiler借口。使用这个借口,你可以设置源代码路径,classpath,还有目的路径。通过将每个待编译的文件作为一个个JavaFileObject实例,你可以编译它
们。暂时你还不需要理解这个JavaFileObject。
使用ToolProvider类来获得JavaCompiler接口的一个默认实现。ToolProvider类提供一个getSystemJavaCompiler()方法,返回JavaCompiler接口的一个实例。
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
使用JavaCompiler最简单的方法是直接调用run()方法,run()方法是在Tool接口中实现的,其声明为:
int run(InputStream in,
OutputStream out,
OutputStream err,
String... arguments)
传递null作为其中的流参数会使用默认的System.out, 和 System.err作为函数的前三个参数。后面可变的String实例表示需要传递给编译器的文件名。
所以,为了编译前面提出的Hello类,你只需要:
int results = tool.run(null, null, null, "Hello.java");
假如没有错误的话,这段代码会在目标文件夹里产生一个Hello.class文件。如果出错,run()方法会将消息输出到标准错误流(System.err)中,也就是函数中第三个参数指定的流。函数出错时会返回一个非0值。
你可以使用下面的代码来编译Hello.java文件:
import java.io.*;
import javax.tools.*;
public class CompileIt { <