Java SE6.0调用Java编译器的两种新方法

http://tech.ddvip.com   2007年07月04日    社区交流

内容摘要:使用Java API来编译Java源程序有很多方法,现在让我们来看一种最简单的方法,通过JavaCompiler进行编译。

  最后需要关闭fileManager.close();

  下面是一个完整的演示程序。

import java.io.*;
import java.util.*;
import javax.tools.*;
public class test_compilerapi
{
 private static void compilejava() throws Exception
 {
  JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  // 建立DiagnosticCollector对象
  DiagnosticCollector<JavaFileObject> diagnostics = new
DiagnosticCollector<JavaFileObject>();
  StandardJavaFileManager fileManager = compiler.getStandardFileManager(
diagnostics, null, null);
  // 建立用于保存被编译文件名的对象
  // 每个文件被保存在一个从JavaFileObject继承的类中
  Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjectsFromStrings(Arrays asList("test3.java"));
  JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
diagnostics, null, null, compilationUnits);
  // 编译源程序
  boolean success = task.call();
  fileManager.close();
  System.out.println((success)?"编译成功":"编译失败");
 }
 public static void main(String args[]) throws Exception
 {
  compilejava();
 }
}

  如果想得到具体的编译错误,可以对Diagnostics进行扫描,代码如下:

for (Diagnostic diagnostic : diagnostics.getDiagnostics())
System.out.printf(
"Code: %s%n" +
"Kind: %s%n" +
"Position: %s%n" +
"Start Position: %s%n" +
"End Position: %s%n" +
"Source: %s%n" +
"Message: %s%n",
diagnostic.getCode(), diagnostic.getKind(),
diagnostic.getPosition(), diagnostic.getStartPosition(),
diagnostic.getEndPosition(), diagnostic.getSource(),
diagnostic.getMessage(null));

责编:豆豆技术应用

正在加载评论...