【问题标题】:How to set the source for compilation by a CompilationTask如何通过 CompilationTask 设置编译源
【发布时间】:2011-08-17 22:20:45
【问题描述】:

我不知道如何设置compilationTask 的源文件。

我试过了:

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

但我收到以下错误:

线程“main”java.lang.IllegalArgumentException 中的异常:不是有效的类名:src/Hello.java

当然,如果我使用 null 而不是 classes,我会得到“没有源文件”,因为没有给出源文件。在此之前我尝试使用JavaCompiler 的运行函数,但我无法在字符串参数中指定选项(或者我不知道如何)。

解决办法如下:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

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

 Iterable<? extends JavaFileObject> classes = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File("src/Hello.java")));


CompilationTask task = compiler.getTask(null, null, null, optionList,null, classes);

task.call();

【问题讨论】:

  • 你解决过这个问题吗?如果是这样,您介意发布您的解决方案吗?
  • 帖子已更新解决方案

标签: java compiler-construction java-compiler-api


【解决方案1】:

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

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

【讨论】:

  • 好吧,编译单元,需要一个JavaFileObjects列表,JavaFileObject是一个接口(需要实现它的所有方法)。是否有另一种方法可以将源文件的路径指定为字符串或其他内容?
【解决方案2】:

尝试改变:

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

到:

classes.add(
  new SimpleJavaFileObject(new URI("src/Hello.java"), JavaFileObject.Kind.SOURCE)
);

这有点冗长,但可以完成工作。当然也可以提取成方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多