我想在运行时使用给定的JDK编译Java文件(用于测试注释处理器等)。我正在使用ToolProvider.getSystemJavaCompiler()
获取javac
的实例。
javac
具有-bootclasspath
和--system
(JDK9 +)选项来更改编译源所依据的JDK。但是,如果宿主项目是针对JDK8编译的,则ToolProvider.getSystemJavaCompiler()
返回的实例将是不知道javac
选项的JDK8 --system
,因此无法针对JDK9进行编译。同样,--system
选项不适用于非模块化JDK(JDK8或更早版本)。
所以我的想法是从给定的JDK动态加载ToolProvider
类,而不是使用宿主项目的系统编译器,然后在那更改JDK。对于JDK8,我应该能够使用URLClassLoader
到rt.jar
和tools.jar
来做到这一点,但是如何将类加载器添加到不再具有JAR的模块化JDK中?