【问题标题】:Patch or override an implementation of a core Java 10 class修补或覆盖核心 Java 10 类的实现
【发布时间】:2018-11-22 10:44:09
【问题描述】:

在计算屏幕坐标时经常出现 JFX 中的一个错误 https://bugs.openjdk.java.net/browse/JDK-8194727https://bugs.openjdk.java.net/browse/JDK-8190400

我已将问题追溯到 GeneralTransform3D 的实现,它是 javajfx 运行时的一部分。

我已向 Oracle 提交了错误报告,但在它被接受、修复并发布之前,我需要一种方法来修复我的应用程序。

在 java 8 中,我能够创建一个包含该类的固定版本的 jar,并将其安装在 lib/ext 文件夹中。这似乎可行,并且 JFX 实现使用了我自己的 impl。

在 java 10 中,扩展机制已被删除。将补丁 jar 添加到类路径中不起作用,因为在类加载过程中为时已晚。

有没有办法覆盖/修补 Java 10 中核心 Java 类的实现?

请注意,我不是直接使用这个类,它是由框架使用的

【问题讨论】:

  • 如果它可用,那么您可以修改框架,以便所有对损坏的核心 java 类的引用都将使用您正确的类.....但这是一个非常混乱的解决方案。
  • 您是否碰巧探索了patch module content 选项?
  • thanks @nullpointer patch module 看起来很有趣,但我有一个使用 java 代理的解决方案。我确实注意到他们说 --patch-module 选项仅用于测试和调试。强烈建议不要在生产环境中使用它。但他们可能也会说我在用 java 代理做什么
  • --patch-module javafx.runtime=patch.jar 是在此模块中覆盖类的正确方法。在这种情况下使用代理有点疯狂。顺便说一句:在这种情况下,在 JDK 8 中使用 ext 目录很脆弱,因为如果首先找到带有补丁的 JAR 文件,则它是随机的。

标签: java classloader java-10


【解决方案1】:

Alan 再次给出最佳答案 a comment。 :) 引用:

--patch-module javafx.runtime=patch.jar 是在这个模块中覆盖类的正确方法

如果您需要“覆盖”平台模块中的类,请使用--patch-module 来执行此操作。如果这会拖累其他依赖项,请确保使用 --add-reads 使它们可读。

【讨论】:

  • 我将把它作为我的解决方案,因为它是由Alan Bateman 推荐的,并且绝对比我拥有的 java 代理解决方案更容易。我应该注意我必须使用javafx.graphics 而不是javafx.runtime。如果这有什么不同,我会使用 java 10。
【解决方案2】:

我需要这样做,但我是通过 JNI 接口(而不是命令行)从 C 启动 Java。只是将命令行参数转换为 JavaVMOptions 是行不通的。相反,这一切都在一个 arg 中,如下所示:

JavaVMOption options[N_ARGS] = { 0 };
options[0].optionString = "--patch-module=javafx.runtime=patch.jar";

花了很多时间才弄清楚这一点,所以希望它可以节省其他人一些时间。

【讨论】:

    【解决方案3】:

    根据这个问题,使用 java 代理似乎可以解决问题

    Replace a class within the Java class library with a custom version

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多