Я хочу скомпилировать исходный код, не имея зависимостей, присутствующих на машине.
Пример: Файл 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 и анализ сообщений об ошибках для отсутствующих символов. Таким образом, я буду знать, какие символы необходимы, получить их и перекомпилировать.
Любые другие обходные пути/решения?