JavaCompiler с пользовательским ClassLoader и FileManager

Я хочу скомпилировать исходный код без наличия зависимостей на машине.
Пример: Файл A.java:

import some.pkg.B; 
public class A extends B {...}

У меня нет исходного кода B, я хочу подключить либо JavaFileManager, либо пользовательский ClassLoader, чтобы получить рассматриваемые символы (пакет 'some.package' и класс B) и затем используйте службу, которая извлекает исходную строку.

Код компиляции: (в inputFiles есть A.java)

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();

Хуки на JavaFileManager (getFileForInput..) и на моем загрузчике классов (findClass, loadClass ..) не сработали при компиляции, и я получил сообщения об ошибках:

A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B

РЕДАКТИРОВАТЬ

Поигравшись с API, просмотрев исходный код JavaCompiler (более старая версия) и прочитав Обзор компиляции, я все еще не могу найти хук API, который я мог бы использовать для предоставления мне символов из синтаксических деревьев . Кажется, что API должен получать все ресурсы на основе имен пакетов, как это предлагает kschneid.
Один обходной путь, о котором я подумал, — запустить JavaCompiler и проанализировать сообщения об ошибках на предмет отсутствующих символов. Так я узнаю, какие символы нужны, получу их и перекомпилирую.
Любые другие обходные пути/решения?

10
задан Chen Harel 3 June 2012 в 07:34
поделиться