如何使用JavaCompiler API一次编译多个Java类

时间:2012-06-07 16:35:40

标签: java compilation java-compiler-api

我是java的新手,我正在关注this tutorial,因为它非常有用,并且非常详细地解释了所有内容。在本教程的底部,它解释了如何使用JavaFileManager来编译多个java文件,并提供了一些示例,但我仍然无法自己编译多个文件

另一个问题是,在示例中它只展示了如何编译一个java文件(我已经可以使用了),但是我遇到了多个文件,因为我希望能够编译项目由我自己的系统中的多个java类组成

这就是我现在所需要的:

public static void main(String[] args) throws Exception {
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    // Line 1.
    MyDiagnosticListener listener = new MyDiagnosticListener(); // Line 2.
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(
            listener, null, null); // Line 3.
    String fileToCompile = "test" + File.separator + "ManyErrors.java";
    // Line 4
    Iterable fileObjects = fileManager.getJavaFileObjectsFromStrings(Arrays
            .asList(fileToCompile)); // Line 5
    CompilationTask task = compiler.getTask(null, fileManager, listener,
            null, null, fileObjects); // Line 6
    Boolean result = task.call(); // Line 7
    if (result == true) {
        System.out.println("Compilation has succeeded");
    }
}


class MyDiagnosticListener implements DiagnosticListener {
public void report(Diagnostic diagnostic) {
    System.out.println("Code->" + diagnostic.getCode());
    System.out.println("Column Number->" + diagnostic.getColumnNumber());
    System.out.println("End Position->" + diagnostic.getEndPosition());
    System.out.println("Kind->" + diagnostic.getKind());
    System.out.println("Line Number->" + diagnostic.getLineNumber());
    System.out.println("Message->" + diagnostic.getMessage(Locale.ENGLISH));
    System.out.println("Position->" + diagnostic.getPosition());
    System.out.println("Source" + diagnostic.getSource());
    System.out.println("Start Position->" + diagnostic.getStartPosition());
    System.out.println("\n");
}

1 个答案:

答案 0 :(得分:2)

来自StandardJavaFileManager

getJavaFileObjectsFromStrings需要Iterable<String>

这意味着您可以将任何可迭代的字符串集合传递给它以获取Iterable<? extends JavaFileObject>,然后将其传递给实现JavaCompiler接口的任何类的getTask method


这与答案无关,但我想补充一点,如果您的目标是熟悉Java,那么您可能会走错路。 Java类的程序编译是一个相当高级的主题,并且您似乎并不理解您完全发布的代码,因为您的问题的答案就在其中:Arrays.asList(fileToCompile)调用创建了一个完全符合字符串的数组其中有一个字符串;即使没有文档,也应该很容易推断getJavaFileObjectsFromStrings获取与文件名对应的字符串数组。所以我真的不想尝试走这条路,而是先熟悉Java文档和更简单的概念。特别是如果您不熟悉OO概念。