【问题标题】:How to patch OpenJDK 9 with Jigsaw integrated?如何修补集成了 Jigsaw 的 OpenJDK 9?
【发布时间】:2016-03-28 20:31:34
【问题描述】:

在 Jigsaw 之前,替换 OpenJDK 中的一个或多个类非常容易(执行一些测试或做出贡献)。我可以从OpenJDK源复制一个原始文件,例如java/util/ArrayList.javasrc/java/util/,添加我想要的任何更改,然后正常编译(输出到mypatch目录):

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

之后我可以用-Xbootclasspath/p 启动JVM,用打过补丁的ArrayList 替换原来的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 打补丁?

【问题讨论】:

    标签: java jvm javac java-9 java-platform-module-system


    【解决方案1】:

    从 javac 错误信息可以知道你正在编译的类属于java.base 模块。现在要编译 JDK 类,您必须使用 --patch-module 参数指定它所属的模块:

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

    现在用新的类替换现有的类,使用--patch-module &lt;module-name&gt; JVM 参数:

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

    这里我们应该指定包含子目录的目录,这些子目录以相应的模块命名。现在一切都像以前一样工作。如果您修补了多个模块,您可以指定多次:

    $ java --patch-module java.base=mypatch --patch-module java.xml=myxmlpatch MyTestClass
    

    【讨论】:

    • 请注意,您使用的 -Xpatch 语法是旧形式,很快就会消失 - 请参阅 the mailing list
    • 谢谢,一旦答案发生变化,我会更新答案。似乎当前的新形式不适用于 JDK 包。
    • @TagirValeev 我收到此错误javac: invalid flag: -Xmodule:jdk.jshell 我运行了命令,javac -Xmodule:jdk.jshell -d bin/ --source-path src/ src/jdk/jshell/execution/JDIInitiator.java 我错过了什么吗?
    • 我已经找到并发布了这个问题的答案。谢谢
    • -Xmodule 选项已被删除 - Jack's answer 显示如何在没有它的情况下执行此操作。
    【解决方案2】:

    这是适用于已发布版本的 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: Module System Quick-Start Guide

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      相关资源
      最近更新 更多