使用jdk11运行java代码,但使用jdk8中的tools.jar

使用jdk11运行java代码,但使用jdk8中的tools.jar,java,java-8,java-11,tools.jar,Java,Java 8,Java 11,Tools.jar,程序是用JDK8编译的。我想用JDK11运行代码,而不用用JDK11重新编译代码 问题是程序使用的类来自JDK8 tools.jar,这些类现在位于jdk11的jdk.compiler模块中,tools.jar被添加到类路径中。在JDK11中,工具没有单独的jar,而是JDK11的一部分。所以存在类冲突类在JDK11中,也在类路径上的tools.jar中。JDK11中的类优先于tools.jar中的类。有没有可能告诉JVM它应该使用tools.jar中的类而不是JDK11中的类 更新 正如我所说

程序是用JDK8编译的。我想用JDK11运行代码,而不用用JDK11重新编译代码

问题是程序使用的类来自JDK8 tools.jar,这些类现在位于jdk11的jdk.compiler模块中,tools.jar被添加到类路径中。在JDK11中,工具没有单独的jar,而是JDK11的一部分。所以存在类冲突类在JDK11中,也在类路径上的tools.jar中。JDK11中的类优先于tools.jar中的类。有没有可能告诉JVM它应该使用tools.jar中的类而不是JDK11中的类

更新 正如我所说,我不能用JDK11重新编译代码。 我知道Java9中引入的Java模块系统。 我要问的是,是否有可能告诉JVM忽略来自JDK11模块jdk.compiler的类,而不是使用他在类路径上找到的类。

虽然我真的不建议这样做,但使用-limit modules选项可以实现您想要的:

这将排除除java.se之外的所有模块,并且您将能够使用tools.jar中的类


同样,这是一个糟糕的建议。让代码与新的系统类兼容比使用JDK 8中的类要好得多。

使用tools.jar中的类非常不具体。请编辑您的问题,并说明具体使用了哪些类以及用于什么目的?也许在Java11中使用这些类会更好。您可能想先了解Java9引入的Java模块概念。您绝对不希望任何人将java 8 tools.jar与java 11 jvm一起使用。一点也不!不要那样做。这绝对不是一个受支持的配置。让我总结一下:您有一个专有的纯二进制软件,它使用tools.jar的目的您不会告诉我们,您询问我们是否可以将Java 8中的tools.jar与Java 11一起使用。我看到两个答案:谁知道?也许吧。我知道它使用tools.jar的目的。它使用tools.jar,因为定制编译需要com.sun.tools.javac类。问题是,是否有可能告诉jvm忽略模块JDK11模块jdk.compiler类,而不是使用classpath中的类。以当前的jdk版本继承率,试图使现有代码兼容会变得非常麻烦。
java --limit-modules java.se <rest of arguments>