如何使用Jigsaw集成修补OpenJDK 9?

时间:2016-03-28 20:31:34

标签: java jvm javac java-9 jigsaw

在Jigsaw之前,很容易在OpenJDK中替换一个或几个类(执行一些测试或做出贡献)。我可以将原始文件从OpenJDK源复制,例如-Lplugins-lpnp_basictools,添加我想要的任何更改,然后正常编译(输出到win32:LIBS ~= s/-l(.*)/-l\1d/g 目录):

java/util/ArrayList.java

之后,我可以使用src/java/util/启动JVM,将原始mypatch替换为已修补的版本:

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

然而,自Java 9-ea + 111中的Jigsaw集成以来,这不再起作用了。编译命令报告大量错误,如下所示:

-Xbootclasspath/p

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

ArrayList

如何使用Jigsaw为JDK制作补丁?

2 个答案:

答案 0 :(得分:10)

从javac错误消息中,您可以知道您正在编译的类属于$ java -Xbootclasspath/p:mypatch MyTestClass 模块。现在要编译JDK类,您必须使用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 ^ 参数指定它所属的模块:

-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.

现在用新的类替换现有的类使用java.base JVM参数:

--patch-module

这里我们应该指定包含名为相应模块的子目录的目录。现在一切都和以前一样。如果修补了几个模块,可以多次指定:

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

答案 1 :(得分:2)

以下是适用于jdk 9发布版本的新解决方案。

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

java --patch-module java.base=mypatches/java.base ...

来源:Project Jigsaw: Module System Quick-Start Guide