java - 如何通过 CompilationTask 设置编译源

标签 java compiler-construction java-compiler-api

我不知道如何设置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();

但我收到以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: src/Hello.java

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

解决方案如下:

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

最佳答案

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

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

关于java - 如何通过 CompilationTask 设置编译源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873576/

相关文章:

java - 在 Camunda-Spring Integration 上, Activity 任务的任务定义为空

c - MSVC 和优化常量表达式

java - 有没有办法在给定范围内生成唯一的变量名?

java - 清除java中通过class.forName加载的类

java - 在java中使用线程实现runnable时,形状不移动

java - 触发 REST 调用时无法解释某些汉字

algorithm - 如何创建允许语法错误的 AST 解析器?

compiler-construction - 我可以将 AST 转换为 SSA,还是需要先转换为 CFG,然后再转换为 SSA?

java - 使用 javax.tools.JavaCompiler 在内存中完全编译代码

使用 Twitter 屏幕名称获取任何用户的 Twitter 关注者的 Java 代码