如何在集成了 Jigsaw 的情况下为 OpenJDK 9 打补丁?
How to patch OpenJDK 9 with Jigsaw integrated?
在 Jigsaw 之前,在 OpenJDK 中替换一个或多个 类 非常容易(进行一些测试或做出贡献)。我可以从 OpenJDK 源复制一个原始文件,例如 java/util/ArrayList.java
到 src/java/util/
,添加我想要的任何更改,然后正常编译它(输出到 mypatch
目录) :
$ javac.exe src\java\util\ArrayList.java -d mypatch
之后,我可以使用 -Xbootclasspath/p
启动 JVM,用修补后的 ArrayList
替换原来的 ArrayList
:
$ java -Xbootclasspath/p:mypatch MyTestClass
然而,自从 Java 9-ea+111 中的 Jigsaw 集成以来,这不再有效。编译命令报告大量错误,如下所示:
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的报错信息可以知道,你编译的class属于java.base
模块。现在编译 JDK class 你必须用 --patch-module
参数指定它所属的模块:
$ javac --patch-module java.base=src -d mypatch \
src/java.base/java/util/ArrayList.java
现在要用新的 classes 替换现有的 --patch-module <module-name>
JVM 参数:
$ java --patch-module java.base=mypatch MyTestClass
这里我们应该指定包含与相应模块同名的子目录的目录。现在一切都像以前一样工作。如果你修补了几个模块,你可以多次指定它:
$ java --patch-module java.base=mypatch --patch-module java.xml=myxmlpatch MyTestClass
这是适用于 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 ...
在 Jigsaw 之前,在 OpenJDK 中替换一个或多个 类 非常容易(进行一些测试或做出贡献)。我可以从 OpenJDK 源复制一个原始文件,例如 java/util/ArrayList.java
到 src/java/util/
,添加我想要的任何更改,然后正常编译它(输出到 mypatch
目录) :
$ javac.exe src\java\util\ArrayList.java -d mypatch
之后,我可以使用 -Xbootclasspath/p
启动 JVM,用修补后的 ArrayList
替换原来的 ArrayList
:
$ java -Xbootclasspath/p:mypatch MyTestClass
然而,自从 Java 9-ea+111 中的 Jigsaw 集成以来,这不再有效。编译命令报告大量错误,如下所示:
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的报错信息可以知道,你编译的class属于java.base
模块。现在编译 JDK class 你必须用 --patch-module
参数指定它所属的模块:
$ javac --patch-module java.base=src -d mypatch \
src/java.base/java/util/ArrayList.java
现在要用新的 classes 替换现有的 --patch-module <module-name>
JVM 参数:
$ java --patch-module java.base=mypatch MyTestClass
这里我们应该指定包含与相应模块同名的子目录的目录。现在一切都像以前一样工作。如果你修补了几个模块,你可以多次指定它:
$ java --patch-module java.base=mypatch --patch-module java.xml=myxmlpatch MyTestClass
这是适用于 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 ...