Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to patch OpenJDK 9 with Jigsaw integrated?

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?

like image 455
Tagir Valeev Avatar asked Mar 28 '16 20:03

Tagir Valeev


2 Answers

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
like image 190
7 revs, 2 users 97% Avatar answered Oct 08 '22 16:10

7 revs, 2 users 97%


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

like image 3
JackDaniels Avatar answered Oct 08 '22 16:10

JackDaniels