【问题标题】:Run java code with jdk11 but use tools.jar from jdk8使用 jdk11 运行 java 代码,但使用 jdk8 中的 tools.jar
【发布时间】:2019-06-24 16:24:26
【问题描述】:

程序是用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 中的类,而不是使用他在类路径中找到的类。

【问题讨论】:

  • “使用 tools.jar 中的类” 非常不具体。您能否编辑您的问题并说出具体使用了哪些类以及用于什么目的?可能在 Java 11 中使用这些类更好。
  • 您可能想首先了解 Java 9 引入的 Java 模块概念。您绝对想让任何人使用带有 java 11 的 java 8 tools.jar虚拟机。一点也不!
  • 不要那样做。这绝对不是受支持的配置。
  • 让我总结一下:你有一个专有的二进制软件,它使用 tools.jar 的目的你不会告诉你,你问我们是否可以使用 Java 中的 tools.jar,但没有提供更多信息8 与 Java 11。我看到两个答案:“谁知道?”和“也许”。
  • 我知道它使用 tools.jar 的目的。它使用 tools.jar,因为自定义编译需要 com.sun.tools.javac 类。问题是是否有可能告诉 jvm 忽略模块 JDK11 模块 jdk.compiler 类,而不是使用类路径中的类。

标签: java java-8 java-11 tools.jar


【解决方案1】:

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

java --limit-modules java.se <rest of arguments>

这将排除除java.se 之外的所有模块,您将能够使用来自tools.jar 的类。

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

【讨论】:

  • 以目前的jdk版本继承速度,试图让现有代码兼容会变得如此烦人。
猜你喜欢
  • 2021-08-20
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2023-02-23
相关资源
最近更新 更多