我必须以编程方式编译数千个动态生成的Java文件。其中一些文件可能与其他文件有依赖关系;但这不是一个要求,因此混合中可能还有简单的孤立Java文件。 现在,我正在使用JavaCompiler API和Diagnostics;以及一个复杂版本中的BundleFileManager。
但是我刚刚发现,如果我尝试在同一个CompilationUnit中编译3个文件(每个文件都是隔离的,没有内部依赖性),其中一个文件有任何编译错误;没有生成类。我原以为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();
}
}
}
可以使用简单的主要传递作为参数来运行哪个文件路径进行编译。在我的情况下&#34; ./ resources / Correct1.java&#34; &#34; ./资源/ Correct2.java&#34; &#34; ./资源/ Incorrect1.java&#34;其中
Correct1是:
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;
}