Before Jigsaw it was quite easy to replace one or several classes in OpenJDK (to perform some test or make a contribution). I could copy an original file from OpenJDK source, for example, java/util/ArrayList.java
into src/java/util/
, add any changes I want, then compile it normally (outputting to mypatch
directory):
$ javac.exe src\java\util\ArrayList.java -d mypatch
After that I could launch JVM with -Xbootclasspath/p
to replace original ArrayList
with the patched one:
$ java -Xbootclasspath/p:mypatch MyTestClass
However this does not work anymore since Jigsaw integration in Java 9-ea+111. The compilation command reports tons of errors starting like this:
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
^
And even if I compile with older JDK, then JVM cannot start:
-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.
How to make patches for JDK with Jigsaw?
From the javac error message you can know that the class you're compiling belongs to the java.base
module. Now to compile the JDK class you have to specify the module it belongs with --patch-module
argument:
$ javac --patch-module java.base=src -d mypatch \
src/java.base/java/util/ArrayList.java
Now to replace existing classes with the new ones use --patch-module <module-name>
JVM argument:
$ java --patch-module java.base=mypatch MyTestClass
Here we should specify the directory which contains subdirectories named like the corresponding modules. Now everything works as before. You may specify this several times if you patched several modules:
$ java --patch-module java.base=mypatch --patch-module java.xml=myxmlpatch MyTestClass
Here is the new solution that works with the released version of 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 ...
Source: Project Jigsaw: Module System Quick-Start Guide
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With