2016-03-28 17 views
7

Prima di Jigsaw era abbastanza facile sostituire una o più classi in OpenJDK (per eseguire qualche test o dare un contributo). Potrei copiare un file originale dalla fonte OpenJDK, per esempio, java/util/ArrayList.java in src/java/util/, aggiungere tutte le modifiche che voglio, quindi compilarlo normalmente (l'output a mypatch directory):Come patch OpenJDK 9 con Jigsaw integrato?

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

Dopo che ho potuto lanciare JVM con -Xbootclasspath/p a sostituire originale ArrayList con la patch uno:

$ java -Xbootclasspath/p:mypatch MyTestClass 

Tuttavia, questo non funziona più in quanto l'integrazione Jigsaw in Java 9-bis + 111. Il comando di compilazione tonnellate di errori di iniziare in questo modo:

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 
       ^

E anche se io compilo con più vecchio JDK, quindi JVM non può iniziare:

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

Come rendere le patch per JDK con Jigsaw?

risposta

8

Dal messaggio di errore javac è possibile sapere che la classe che si sta compilando appartiene al modulo java.base. Ora per compilare la classe JDK è necessario specificare il modulo appartiene con il nuovo -Xmodule argomento:

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

Ora per sostituire classi esistenti con quelli nuovi utilizzano --patch-module <module-name> JVM argomento:

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

Qui dovremmo specificare la directory che contiene sottodirectory denominate come i moduli corrispondenti. Ora tutto funziona come prima. È possibile specificare più volte se si patchato diversi moduli:

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

Si noti che la La sintassi '-Xpatch' che stai utilizzando è un vecchio modulo, che scomparirà presto - vedi [la mailing list] (http://mail.openjdk.java.net/pipermail/jigsaw-dev/2016-March/007079.html). – Nicolai

+0

Grazie, aggiornerò la risposta una volta che cambierà. Sembra che attualmente il nuovo modulo non funzioni per i pacchetti JDK. –

+0

@NicolaiParlog aggiornato, grazie ancora –

2

Ecco la nuova soluzione che funziona con la versione rilasciata di 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 ... 

Fonte: Project Jigsaw: Module System Quick-Start Guide

Problemi correlati