Java 如何设置CompilationTask编译的源代码

Java 如何设置CompilationTask编译的源代码,java,compiler-construction,java-compiler-api,Java,Compiler Construction,Java Compiler Api,我不知道如何为编译任务设置源文件 我试过这个: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes")); List<String> classes = new ArrayList<String>(); clas

我不知道如何为
编译任务设置源文件

我试过这个:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes"));

List<String> classes = new ArrayList<String>();
classes.add("src/Hello.java");
CompilationTask task = compiler.getTask(null, null, null, optionList, classes, null);

task.call();

下面的代码应该可以解决这个问题,尽管我在机器上运行代码时将路径设置为绝对路径:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fm = compiler.getStandardFileManager(diagnostics, null, null);

ArrayList<String> optionList = new ArrayList<String>(Arrays.asList("-d","build/classes"));

ArrayList<File> files = new ArrayList<File>();
files.add(new File("src/Hello.java"));
CompilationTask task = compiler.getTask(null, null, null, optionList, null, fm.getJavaFileObjectsFromFiles(files));

task.call();
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
DiagnosticCollector diagnostics=新建DiagnosticCollector();
StandardJavaFileManager fm=compiler.getStandardFileManager(诊断,null,null);
ArrayList optionList=新的ArrayList(Arrays.asList(“-d”,“build/classes”);
ArrayList files=新的ArrayList();
add(新文件(“src/Hello.java”);
CompilationTask=compiler.getTask(null,null,null,optionList,null,fm.getJavaFileObjectsFromFiles(files));
task.call();
尝试更改:

classes.add("src/Hello.java");
致:


这有点冗长,但确实有效。当然,它可以被提取到一个方法。

编译单元需要一个JavaFileObject列表,JavaFileObject是一个接口(需要实现它的所有方法)。是否有其他方法可以将源文件的路径指定为字符串或其他内容?您解决过这个问题吗?如果是这样的话,你介意发布你的解决方案吗?发布会用解决方案更新
classes.add("src/Hello.java");
classes.add(
  new SimpleJavaFileObject(new URI("src/Hello.java"), JavaFileObject.Kind.SOURCE)
);