12

Jigsaw 以前は、OpenJDK の 1 つまたは複数のクラスを置き換えるのは非常に簡単でした (何らかのテストを実行したり、貢献したりするため)。たとえば、元のファイルを OpenJDK ソースから にコピーし、java/util/ArrayList.java必要src/java/util/な変更を追加してから、通常どおりコンパイルします (mypatchディレクトリに出力します)。

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

その後、JVM を起動してオリジナルをパッチ適用済みのもの-Xbootclasspath/pに置き換えることができます。ArrayList

$ java -Xbootclasspath/p:mypatch MyTestClass

ただし、Java 9-ea+111 での Jigsaw 統合以降、これは機能しなくなりました。コンパイル コマンドは、次のように始まる大量のエラーを報告します。

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
                   ^

また、古い 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.

Jigsaw で JDK のパッチを作成するには?

4

2 に答える 2

12

java.basejavac エラー メッセージから、コンパイルしているクラスがモジュールに属していることがわかります。JDK クラスをコンパイルするには、それが属するモジュールを--patch-module引数で指定する必要があります。

$ 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
于 2016-03-28T20:31:34.177 に答える