Как исправить OpenJDK 9 с интегрированной головоломкой?

перед Jigsaw было довольно легко заменить один или несколько классов в OpenJDK (выполнить некоторый тест или внести свой вклад). Я мог бы скопировать исходный файл из источника OpenJDK, например,java/util/ArrayList.java на src/java/util/, добавьте любые изменения, которые я хочу, а затем скомпилируйте его нормально (вывод в ):

$ javac.exe srcjavautilArrayList.java -d mypatch

после этого я мог бы запустить JVM с -Xbootclasspath/p заменить оригинал ArrayList С латаным:

$ java -Xbootclasspath/p:mypatch MyTestClass

однако это больше не работает с момента интеграции Jigsaw в Java 9-ea+111. Команда компиляции сообщает тонны ошибок, начиная с этого:

srcjavautilArrayList.java:26: error: package exists in another module: java.base
package java.util;
^
srcjavautilArrayList.java:108: error: cannot find symbol
public class ArrayList<E> extends AbstractList<E>
                                  ^
  symbol: class AbstractList
srcjavautilArrayList.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.

как сделать патчи для JDK с Jigsaw?

2 ответов


из сообщения об ошибке javac вы можете знать, что класс, который вы компилируете, принадлежит java.base модуль. Теперь, чтобы скомпилировать класс JDK, вы должны указать модуль, к которому он принадлежит с new :

$ javac --patch-module java.base=src -d mypatch \
      src/java.base/java/util/ArrayList.java

теперь для замены существующих классов новыми используйте --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 ...

источник: Project Jigsaw: Модуль Системы Краткое Руководство