修补或覆盖核心的实现 Java 10 class
Patch or override an implementation of a core Java 10 class
JFX 中存在一个错误,该错误经常在计算屏幕坐标时出现
https://bugs.openjdk.java.net/browse/JDK-8194727 和
https://bugs.openjdk.java.net/browse/JDK-8190400
我已将问题追溯到 GeneralTransform3D 的实现,它是 javajfx 运行时的一部分。
我已向 Oracle 提交错误报告,但在它被接受、修复并发布之前,我需要一种方法来修复我的应用程序。
在 java 8 中,我能够创建一个包含 class 固定版本的 jar 并将其安装在 lib/ext 文件夹中。这似乎有效,JFX 实现使用了我的实现而不是它自己的实现。
在 java 10 中,扩展机制已被删除。将补丁 jar 添加到 class 路径不起作用,因为在 class 加载过程中为时已晚。
有没有办法 override/patch 在 Java 10 中实现核心 java classes?
请注意,我没有直接使用这个class,它是由框架使用的
根据这个问题
,使用 java 代理似乎可以解决这个问题
再一次,Alan gives the best answer as 。 :) 引用:
--patch-module javafx.runtime=patch.jar
is the right way to override classes in this module
如果您需要在平台模块中 "override" 一个 class,请使用 --patch-module
to do that. If that drags in additional dependencies, make sure to make them readable with --add-reads
。
我需要这样做,但我是通过 JNI 接口(而不是命令行)从 C 启动 Java。只是将命令行参数转换为 JavaVMOptions 是行不通的。相反,它全部放在一个参数中,如下所示:
JavaVMOption options[N_ARGS] = { 0 };
options[0].optionString = "--patch-module=javafx.runtime=patch.jar";
我花了很多时间才弄清楚这个问题,所以希望它能为其他人节省一些时间。
JFX 中存在一个错误,该错误经常在计算屏幕坐标时出现 https://bugs.openjdk.java.net/browse/JDK-8194727 和 https://bugs.openjdk.java.net/browse/JDK-8190400
我已将问题追溯到 GeneralTransform3D 的实现,它是 javajfx 运行时的一部分。
我已向 Oracle 提交错误报告,但在它被接受、修复并发布之前,我需要一种方法来修复我的应用程序。
在 java 8 中,我能够创建一个包含 class 固定版本的 jar 并将其安装在 lib/ext 文件夹中。这似乎有效,JFX 实现使用了我的实现而不是它自己的实现。
在 java 10 中,扩展机制已被删除。将补丁 jar 添加到 class 路径不起作用,因为在 class 加载过程中为时已晚。
有没有办法 override/patch 在 Java 10 中实现核心 java classes?
请注意,我没有直接使用这个class,它是由框架使用的
根据这个问题
,使用 java 代理似乎可以解决这个问题再一次,Alan gives the best answer as
--patch-module javafx.runtime=patch.jar
is the right way to override classes in this module
如果您需要在平台模块中 "override" 一个 class,请使用 --patch-module
to do that. If that drags in additional dependencies, make sure to make them readable with --add-reads
。
我需要这样做,但我是通过 JNI 接口(而不是命令行)从 C 启动 Java。只是将命令行参数转换为 JavaVMOptions 是行不通的。相反,它全部放在一个参数中,如下所示:
JavaVMOption options[N_ARGS] = { 0 };
options[0].optionString = "--patch-module=javafx.runtime=patch.jar";
我花了很多时间才弄清楚这个问题,所以希望它能为其他人节省一些时间。