为什么不编译? (JavaCompiler工作正常,但需要请求注释处理)

时间:2017-05-09 20:11:17

标签: java compilation javacompiler

这是错误;

错误:只有在明确请求注释处理时才接受类名“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时有什么不同吗?我的构造函数中的参数是错误的吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您误用了编译器对象:

  1. Classes参数用于传递注释
  2. CompilationUnits参数是您应该使用的
  3. 您应该这样调用它(注意:您必须提供有效的文件路径):

    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();
    
相关问题