Как получить список файлов классов, сгенерированных 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

Другие вопросы по тегам