如何使用JavaCompilerAPI一次性编译多个Java类

如何使用JavaCompilerAPI一次性编译多个Java类,java,compilation,java-compiler-api,Java,Compilation,Java Compiler Api,我是java新手,我关注它,因为它提供了大量信息,并且非常详细地解释了一切。在本教程的底部,它解释了如何使用JavaFileManager来编译多个java文件,并给出了一些例子,但我仍然无法让它自己编译多个文件 另一个问题是,在这个示例中,它只显示了如何编译一个java文件(我已经可以开始工作了),但我遇到的问题是多个文件,因为我希望能够在自己的系统中编译由多个java类组成的项目 这就是我现在要做的: public static void main(String[] args) throws

我是java新手,我关注它,因为它提供了大量信息,并且非常详细地解释了一切。在本教程的底部,它解释了如何使用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");
}
StandardJavaFileManager
获取一个
Iterable


这意味着您可以通过传递任何iterable字符串集合来获得
IterableYou是Java新手,但您想动态编译Java类吗?我不认为这是一个好主意,动态编译类加载是一个非常高级的主题。我对C编程很有经验,在过去的几周里,我已经改变了,所以我也可以使用Java,所以我理解所有的概念和一切,这是了不起的