Как получить список файлов классов, сгенерированных JavaCompiler compilationTask?
Я пытаюсь скомпилировать Java-код динамически с помощью javaCompiler. Код работает gr8, однако мне нужно получить список файлов классов, созданных CompilationTask. Вот исходный код:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler ();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager (diagnostics,null,null);
//compile unit
Iterable<? extends JavaFileObject> compilationUnits =fileManager.getJavaFileObjectsFromFiles (sourceFileList);
CompilationTask task = compiler.getTask (null,fileManager, diagnostics, null, null, compilationUnits);
task.call ();
Как я могу получить список классов, сгенерированных вышеприведенным кодом, в том числе внутренний класс. Любая помощь приветствуется.
2 ответа
Файловый менеджер, который вы предоставляете задаче, отвечает за отображение JavaFileObject
Это относится к физическим файлам, поэтому он не только знает, к каким ресурсам обращаются или которые создаются, но даже контролирует, какой физический ресурс будет использоваться. Конечно, просто найти созданные ресурсы после обработки тоже возможно. Вот простой автономный пример:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);
Path tmp=Files.createTempDirectory("compile-test-");
fileManager.setLocation(StandardLocation.CLASS_OUTPUT,Collections.singleton(tmp.toFile()));
Path src=tmp.resolve("A.java");
Files.write(src, Arrays.asList(
"package test;",
"class A {",
" class B {",
" }",
"}"
));
CompilationTask task = compiler.getTask(null, fileManager,
null, null, null, fileManager.getJavaFileObjects(src.toFile()));
if(task.call()) {
for(JavaFileObject jfo: fileManager.list(StandardLocation.CLASS_OUTPUT,
"", Collections.singleton(JavaFileObject.Kind.CLASS), true)) {
System.out.println(jfo.getName());
}
}
В нем будут перечислены местоположения сгенерированных A.class
а также A$B.class
...
Метод javax.tools.JavaCompiler#getTask() принимает параметр options, который позволяет устанавливать параметры компилятора. Установите каталог назначения для файлов классов, используя -d
вариант
List<String> options = new ArrayList<String>();
// Sets the destination directory for class files
options.addAll(Arrays.asList("-d","/home/myclasses"));
CompilationTask task = compiler.getTask (null,fileManager, diagnostics, options, null, compilationUnits);
Теперь получите все файлы с .class
Extentions