Java 当某些文件出现错误时,以编程方式编译多个文件

Java 当某些文件出现错误时,以编程方式编译多个文件,java,compiler-errors,javac,Java,Compiler Errors,Javac,我必须以编程方式编译数千个动态生成的Java文件。其中一些文件可能与其他文件存在依赖关系;但这不是一个要求,所以混合中可能也有简单的独立Java文件。 现在,我正在使用JavaCompilerAPI和诊断工具;以及一个复杂版本中的BundleFileManager 然而,我刚刚发现,如果我试图在同一个编译单元中编译3个文件(每个文件都是独立的,没有内部依赖关系),其中一个有任何编译错误;没有生成任何类。我希望Java编译器能够生成2个正确的类,而不是错误的类。 有人能解释为什么吗?这是Java编

我必须以编程方式编译数千个动态生成的Java文件。其中一些文件可能与其他文件存在依赖关系;但这不是一个要求,所以混合中可能也有简单的独立Java文件。 现在,我正在使用JavaCompilerAPI和诊断工具;以及一个复杂版本中的BundleFileManager

然而,我刚刚发现,如果我试图在同一个编译单元中编译3个文件(每个文件都是独立的,没有内部依赖关系),其中一个有任何编译错误;没有生成任何类。我希望Java编译器能够生成2个正确的类,而不是错误的类。 有人能解释为什么吗?这是Java编译器的一个技术约束,还是有一些选项可以放在下面(方法)

我添加了我的虚拟原型的代码:

public static void compileSetOfFiles(String[] files)
{
    File[] srcs = new File[files.length];
    int i = 0;
    for (String fil : files)
    {
        srcs[i] = new File(files[i]);
        i++;
    }
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    Iterable<? extends JavaFileObject> compUnits =  fileManager.getJavaFileObjects(srcs);
     CompilationTask cU = compiler.getTask(null, fileManager, null, null, null, compUnits);   
     Boolean compRes = cU.call();
    if(compRes == true){
        System.out.println("Compilation has succeeded");
    }else{
        System.out.println("Compilation error");
        try {
            fileManager.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
更正2是:

public class Correct2 
{
    private String hello;


    public Correct2(String say)
    {
       hello = say;
    }

    @Override
    public String toString() {
      return hello;
    }
 }
错误1是:

public class Correct1 {

    public void test()
    {
        System.out.println("Hello");
     }
}
public class Incorrect1 
{
   as;
}

我不认为它编译的事实(布尔)会给你编译过的文件,至少Java编译器的文档看起来像是文件管理器用于文件读取,而不是据我所知的写入,遵循Java编译器API这是获得文件管理器的方法。如果我想指定一个不同于默认值的输出文件夹(这对于测试来说是很好的),我应该使用String[]options=newstring[]{“-d”,“output”};然后将这些选项传递给CompliationTask。在任何情况下,当我只使用Correct1.java和Correct2.java时,类都是正确生成的。但如果inputJavaFiles集合中有任何java文件未编译,则不会。您是否有任何关于更改FileManager以编写我可以测试的代码的片段?是否可以选择使用ecj而不是javac?如果需要的话,ecj甚至可以配置为处理有错误的源,甚至生成类文件。HI@StephanHerrmann。可悲的是,由于许可问题和技术必须得到客户批准,因此无法使用ecj:(我不能反对客户要求(尽管客户通常看不到/不关心您使用的构建工具,是吗?)。但是“许可问题”听起来很奇怪。我不知道任何相关的事情,EPL不允许你这么做——我一定是错过了s.t。