0

我需要编译具有仅作为类文件存在的依赖项的 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();

所需的依赖项已由自定义系统类加载器加载,出于安全原因,无法将其写入光盘以提供给编译器的类路径。

有没有办法让 ToolProvider.getSystemJavaCompiler() 从标准 oracle JDK 返回的 JavaCompiler 使用由我的自定义类加载器加载的类文件而不将它们写入光盘?我也愿意根据需要扩展 JavaCompiler 或 JavaFileManager。

到目前为止,我想出的唯一选择是使用反射将依赖项创建为磁盘上的存根 java 文件,编译它们,并将它们提供给 JavaCompiler。我不关心这个选项,因为它看起来很麻烦,而且由于依赖关系非常复杂,所以很困难。

我看过这些问题:

使用 javax.tools.JavaCompiler 在内存中完全编译代码

如何将 JDK6 ToolProvider 和 JavaCompiler 与上下文类加载器一起使用?

然而,这些解决方案处理动态编译,但似乎没有解决仅内存依赖问题。

4

0 回答 0