程序被编译与JDK8。我想运行与JDK11代码(而不与JDK11代码重新编译)。
问题是程序使用了JDK8 tools.jar中的类(现在位于jdk11的jdk.compiler模块中的类,tools.jar已添加到类路径中)。在JDK11中,没有单独的工具罐,而是JDK11的一部分。因此,有一流的冲突(类是在JDK11,也存在一个在classpath中的tools.jar)。 JDK11中的类优先于tools.jar中的类。是否有可能告诉JVM,它应该使用类从tools.jar中,而不是从JDK11类。
更新 如我所说,我无法使用JDK11重新编译代码。 我知道在Java9介绍了Java模块系统。 我想问的是,是否有可能告诉JVM忽略JDK11模块jdk.compiler中的类,而不是使用他在类路径中找到的类。
答案 0 :(得分:0)
尽管我真的不建议这样做,但您可以通过--limit-modules
选项来实现所需的操作:
java --limit-modules java.se <rest of arguments>
这将排除java.se
以外的所有模块,您将可以使用tools.jar
中的类。
再次,这是可怕的建议。使您的代码与新的系统类兼容,而不是使用JDK 8中的代码,要好得多。