0

这是错误;

错误:仅当显式请求注释处理时才接受类名“Hello.java” 1 错误

这是 JavaCompiler 代码;

public static void main(String[] args) {
    PrintWriter writer = new PrintWriter( System.out);
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager( null, null, null);
    ArrayList<String> classes = new ArrayList<>();
    classes.add( "Hello.java");

    JavaCompiler.CompilationTask task = compiler.getTask( writer, fileManager, null, null, classes, null);
    task.call();
}

这是 Hello 类;

public class Hello {
    public static void main(String[] args) {
        System.out.println( "Hi");
    }
}

我知道这个问题被问了近一百万次,但所有的答案都是这个=“你忘记在你的类名末尾添加 .java”,但我做到了,正如你所看到的。为什么这不起作用?使用 JavaCompiler 时有什么不同吗?我在构造函数中的参数是否错误?谢谢您的帮助。

4

1 回答 1

0

您在滥用编译器对象:

  1. Classes 参数用于传递注解
  2. CompilationUnits 参数是您应该使用的

您应该这样称呼它(注意:您必须提供有效的文件路径):

PrintWriter writer = new PrintWriter(System.out);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

Iterable<? extends JavaFileObject> units =
    fileManager.getJavaFileObjectsFromFiles(
        Arrays.asList(new File("Hello.java"))); // put absolute path here

JavaCompiler.CompilationTask task = compiler.getTask(
    writer, fileManager, null, null, null, units); // provide units, not classes
task.call();

fileManager.close();
于 2017-05-09T21:21:03.773 回答