Как исправить 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: Модуль Системы Краткое Руководство