【问题标题】:Why doesn't this compile? (JavaCompiler works fine, but says annotation processing needs to be requested)为什么不编译? (JavaCompiler 工作正常,但表示需要请求注释处理)
【发布时间】:2017-05-09 20:11:17
【问题描述】:

这是错误;

错误:类名“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 时有什么不同吗?我在构造函数中的参数是否错误?感谢您的帮助。

【问题讨论】:

    标签: java compilation javacompiler


    【解决方案1】:

    您误用了编译器对象:

    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();
    

    【讨论】:

    • 是否可以打印到控制台,无论这个“Hello”类在编译期间应该打印什么,还是只能编译?
    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多