Мне нужно скомпилировать java-файлы, у которых есть зависимости, которые существуют только как файлы классов, которые были загружены JVM, выполняющей компиляцию. Я использую javax.tool JavaCompiler примерно так, как описано здесь: Как программно скомпилировать и создать экземпляр класса Java?
Кроме того, я использую StandardJavaFileManager, чтобы указать компилятору мой локальный путь к классам и java-файлы, которые я компилирую.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
...
compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
Требуемые зависимости были загружены настраиваемым загрузчиком системных классов и по соображениям безопасности не могут быть записаны на диск для передачи в путь к классам компилятора.
Есть ли способ получить JavaCompiler, возвращаемый ToolProvider.getSystemJavaCompiler() из стандартного оракула JDK, чтобы использовать файлы классов, которые были загружены моим пользовательским загрузчиком классов, без записи их на диск? Я также открыт для расширения JavaCompiler или JavaFileManager по мере необходимости.
Единственный вариант, который я придумал до сих пор, - это использовать отражение для создания зависимостей в виде заглушенных java-файлов на диске, компилировать их и предоставлять их компилятору Java. Мне не нравится этот вариант, так как он кажется громоздким и сложным, поскольку зависимости довольно сложные.
Я видел эти вопросы:
Полностью компилировать код в памяти с помощью javax.tools.JavaCompiler
Как использовать JDK6 ToolProvider и JavaCompiler с контекстным загрузчиком классов?
Однако эти решения обрабатывают динамическую компиляцию, но, похоже, не решают проблему зависимости только от памяти.