java - 如何在集成了 Jigsaw 的情况下为 OpenJDK 9 打补丁?

标签 java jvm javac java-9 java-platform-module-system

在 Jigsaw 之前,替换 OpenJDK 中的一个或多个类非常容易(执行一些测试或做出贡献)。我可以从 OpenJDK 源复制一个原始文件,例如 java/util/ArrayList.javasrc/java/util/,添加我想要的任何更改,然后编译它通常(输出到 mypatch 目录):

$ javac.exe src\java\util\ArrayList.java -d mypatch

之后,我可以使用 -Xbootclasspath/p 启动 JVM,用修补后的 ArrayList 替换原来的 ArrayList:

$ java -Xbootclasspath/p:mypatch MyTestClass

然而,自从 Jigsaw 集成到 Java 9-ea+111 以来,这不再有效。编译命令报告大量错误,如下所示:

src\java\util\ArrayList.java:26: error: package exists in another module: java.base
package java.util;
^
src\java\util\ArrayList.java:108: error: cannot find symbol
public class ArrayList<E> extends AbstractList<E>
                                  ^
  symbol: class AbstractList
src\java\util\ArrayList.java:109: error: cannot find symbol
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
                   ^

即使我用旧的 JDK 编译,JVM 也无法启动:

-Xbootclasspath/p is no longer a supported option.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

如何用Jigsaw打JDK补丁?

最佳答案

从 javac 的错误信息中你可以知道你正在编译的类属于 java.base模块。现在要编译 JDK 类,您必须指定它属于 --patch-module 的模块。参数:

$ javac --patch-module java.base=src -d mypatch \
      src/java.base/java/util/ArrayList.java

现在要用新类替换现有类,请使用 --patch-module <module-name> JVM 参数:

$ java --patch-module java.base=mypatch MyTestClass

这里我们应该指定目录,其中包含以相应模块命名的子目录。现在一切都像以前一样工作。如果您修补了多个模块,您可以多次指定:

$ java --patch-module java.base=mypatch --patch-module java.xml=myxmlpatch MyTestClass

关于java - 如何在集成了 Jigsaw 的情况下为 OpenJDK 9 打补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36270671/

相关文章:

java - Spring 单元/集成测试设置

java - 页面加载后立即运行 java 脚本命令

java - 使用 scenebuilder 将字符串输出到文本字段 javafx

java - 使用 java 8 查找列表中不存在于另一个列表中的元素

java - 为什么使用 invokedynamic 调用 Java 8 lambda?

eclipse - 如何自动编译大型 Java 项目?

c++ - C 变量可以声明为空吗?

java - 如何减少JVM虚拟内存的使用?

java - 接口(interface)中的协变返回类型未通过 Javac 编译

gradle - 当源代码中存在非 UTF8 字符时,如何让 Gradle 构建失败?