在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制作补丁?
答案 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 ...