Как использовать зависимости, доступные только в памяти вместе с javax.tools JavaCompiler?

Мне нужно скомпилировать 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();

Требуемые зависимости были загружены пользовательским системным загрузчиком классов и по соображениям безопасности не могут быть записаны на диск для передачи в classpath компилятора.

Есть ли способ получить JavaCompiler, возвращаемый ToolProvider.getSystemJavaCompiler() из стандартного оракула JDK, чтобы использовать файлы классов, которые были загружены моим пользовательским загрузчиком классов, без записи их на диск? Я также открыт для расширения JavaCompiler или JavaFileManager по мере необходимости.

Единственный вариант, который я до сих пор придумал, - это использовать отражение для создания зависимостей в виде заготовок java-файлов на диске, компилировать их и предоставлять их JavaCompiler. Мне не важен этот вариант, так как он кажется громоздким и сложным, поскольку зависимости довольно сложны.

Я видел эти вопросы:

Скомпилируйте код полностью в памяти с помощью javax.tools.JavaCompiler

Как мне использовать JDK6 ToolProvider и JavaCompiler с загрузчиком классов контекста?

Однако эти решения обрабатывают динамическую компиляцию, но, похоже, не решают проблему зависимости памяти.

0 ответов

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