How to patch OpenJDK 9 with Jigsaw integrated?

匿名 (未验证) 提交于 2019-12-03 01:38:01

问题:

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?

回答1:

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 


回答2:

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!