Программная компиляция нескольких файлов, когда в некоторых есть ошибки

Я должен программно скомпилировать тысячи динамически генерируемых файлов Java. Некоторые из этих файлов могут зависеть от других; но это не требование, поэтому в миксе могут быть и простые изолированные Java-файлы. Теперь я использую API JavaCompiler и диагностику для этого; а также BundleFileManager в одной сложной версии.

Однако я только что обнаружил, что если я попытаюсь скомпилировать 3 файла (каждый из которых изолирован, без внутренних зависимостей) в одном и том же CompilationUnit, и в одном из них возникнет ошибка компиляции; класс не генерируется. Я ожидал, что компилятор Java сгенерирует 2 правильных класса, а не неправильный. Кто-то может объяснить мне, почему? если это техническое ограничение компилятора Java или есть какая-то опция, которую можно поставить как (eagerApproach)?

Я добавляю код моего фиктивного прототипа:

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();
        }
    }
}

Который может быть запущен с простой передачей в качестве аргументов filePaths для компиляции. В моем случае "./resources/Correct1.java" "./resources/Correct2.java" "./resources/Incorrect1.java" где

Правильный1 это:

public class Correct1 {

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

Correct2 - это:

public class Correct2 
{
    private String hello;


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

    @Override
    public String toString() {
      return hello;
    }
 }

Неправильно1 это:

public class Incorrect1 
{
   as;
}

0 ответов

Другие вопросы по тегам