我需要编译具有依赖关系的java文件,这些依赖关系只存在于由JVM加载进行编译的类文件中。我正在使用javax.tool JavaCompiler,如下所述: How do I programmatically compile and instantiate a Java class?
此外,我使用StandardJavaFileManager向编译器指定我的本地类路径和我正在编译的java文件。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
...
compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
自定义系统类加载器已加载所需的依赖项,并且出于安全原因,无法将其写入光盘以提供给编译器的类路径。
有没有办法让标准oracle JDK中的ToolProvider.getSystemJavaCompiler()返回JavaCompiler,以使用我的自定义类加载器加载的类文件而不将它们写入光盘?我也愿意根据需要扩展JavaCompiler或JavaFileManager。
到目前为止我唯一提出的选择是使用反射来创建依赖关系作为磁盘上的存根java文件,编译它们,并将它们提供给JavaCompiler。我不关心这个选项,因为它看起来很麻烦,而且因为依赖性非常复杂而很困难。
我已经看到了这些问题:
Compile code fully in memory with javax.tools.JavaCompiler
How do I use JDK6 ToolProvider and JavaCompiler with the context classloader?
但是,这些解决方案处理动态编译,但似乎没有解决仅内存依赖性问题。