How to set the source for compilation by a CompilationTask

本小妞迷上赌 提交于 2019-12-11 09:05:41

问题


I do not know how to set the source file for a compilationTask.

I tried this:

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

But I get the following error:

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

of course, if I put null instead of classes I get "no source files" as no source file was given. I tried using the run function of the JavaCompiler before this but I could not specify the options in the string arguments (Or I do not know how).

Here is the solution:

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

回答1:


The following code should solve the problem, though I made the paths absolute when I ran the code on my machine:

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



回答2:


Try changing:

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

to:

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

It's a bit verbose but does the job. Of course it could be extracted to a method.



来源:https://stackoverflow.com/questions/5873576/how-to-set-the-source-for-compilation-by-a-compilationtask

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!