Программная компиляция нескольких файлов, когда в некоторых есть ошибки
Я должен программно скомпилировать тысячи динамически генерируемых файлов 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;
}