2016-03-28 19 views
7

Vor Jigsaw war es ziemlich einfach, eine oder mehrere Klassen in OpenJDK zu ersetzen (um einen Test durchzuführen oder einen Beitrag zu leisten). Ich konnte eine Originaldatei von OpenJDK Quelle, beispielsweise kopieren, java/util/ArrayList.java in src/java/util/, fügen Sie alle Änderungen, die ich will, dann kompilieren Sie es normalerweise (Ausgeben mypatch Verzeichnis):Wie Patch OpenJDK 9 mit Jigsaw integriert?

$ javac.exe src\java\util\ArrayList.java -d mypatch 

Danach konnte ich JVM starten mit -Xbootclasspath/p zu ersetzen original ArrayList mit der gepatchten:

$ java -Xbootclasspath/p:mypatch MyTestClass 

Allerdings ist dies nicht mehr funktionieren, da Jigsaw Integration in Java 9-ea + 111. Die Kompilation Befehl meldet Tonnen von Fehlern beginnen wie folgt aus:

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 
       ^

Und selbst wenn ich mit älteren JDK kompilieren, dann kann JVM nicht starten:

-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. 

Wie Patches für JDK mit Jigsaw zu machen?

Antwort

8

Von der Javac-Fehlermeldung können Sie wissen, dass die Klasse, die Sie kompilieren, zum Modul java.base gehört. Jetzt die JDK-Klasse zu kompilieren, müssen Sie das Modul angeben es mit neuen -Xmodule Argument gehört:

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

jetzt vorhandenen Klassen mit den neuen Argument --patch-module <module-name> JVM zu ersetzen:

$ java --patch-module java-base=mypatch MyTestClass 

Hier sollten wir Geben Sie das Verzeichnis an, das Unterverzeichnisse enthält, die wie die entsprechenden Module benannt sind. Jetzt funktioniert alles wie vorher. Sie können dies mehrmals angeben, wenn Sie mehrere Module gepatcht:

$ java --patch-module java-base=mypatch --patch-module java-xml=myxmlpatch MyTestClass 
+1

Beachten Sie, dass die Die '-Xpatch'-Syntax, die Sie verwenden, ist ein altes Formular, das bald verschwinden wird - siehe [die Mailing-Liste] (http://mail.openjdk.java.net/pipermail/jigaw-dev/2016-March/007079.html). – Nicolai

+0

Danke, ich werde die Antwort aktualisieren, sobald sie sich ändert. Scheint, dass das neue Formular für JDK-Pakete nicht funktioniert. –

+0

@NicolaiParlog aktualisiert, danke nochmal –

2

Hier ist die neue Lösung, die 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 ... 

Quelle mit der freigegebenen Version von jdk funktioniert: Project Jigsaw: Module System Quick-Start Guide