如何使用--patch模块覆盖OpenJDK 11中的java.base/java.lang.Integer



在JDK-8中,我们可以编译更改后的java.lang类并重建rt.jar。然后,我们可以通过用-Xbootclasspath:<yourpathto>/rt.jar扩充bootclasspath来覆盖java.lang类文件。这样做,例如,为了测试目的,我们可以使java.lang.Integer成为非最终版本。

在JDK-11中,情况有所不同。补丁是通过--patch-modules完成的,我无法让它工作。我做了以下工作:

  1. 从openjdk-11源代码中删除最后一个修饰符并重新编译java.base模块
  2. 添加--patch-module java.base=<path-to-my-compiled-java.base-directory>
  3. 它在error: cannot inherit from final Integer上仍然失败。也许我们不能再覆盖JDK源文件的类声明了?这会很奇怪
  4. 我还尝试将这些类文件添加到jar中,并尝试将所有可能的根目录传递给--patch-module参数
  5. 我已尝试从已编译的java.base目录中删除模块package-info.class,并尝试使用--add-opens显式添加java.base.java.lang.Integer

文档并没有真正清楚这种特殊用法。

maven的整个javac命令(我已经尝试过javac和maven编译器插件(:

javac -d ./target/classes -classpath <classpathfiles> -sourcepath <sourcefiles> -s ./target/generated-sources/annotations -g -nowarn -target 11 -source 11 -encoding UTF-8 --patch-module=java.base=../runtimejar/mods/src/java.base -Xplugin:Manifold

(为便于阅读,缩短路径名等(

我在这里错过了什么?为什么我不能这样修改java.base/java.lang.Integer

Project Jigsaw中的示例为您的用例建模。注意--patch模块在javac和java中的使用。

--patch-module

从Doug Lea的CVS中签出java.util.courrent类的开发人员将用于编译源文件和使用-Xbootclasspath/p部署这些类。

-Xbootclasspath/p已被删除,它的模块替换为选项--修补模块以覆盖模块中的类。也可以是用于扩充模块的内容。--patch module选项javac也支持编译代码";就好像";模块的一部分。

下面是一个编译新版本java.util.concurrent.CurrentHashMap并在运行时使用它:

javac --patch-module java.base=src -d mypatches/java.base 
src/java.base/java/util/concurrent/ConcurrentHashMap.java
java --patch-module java.base=mypatches/java.base ...

检查您的源路径是否与--patch模块目录对齐,即是否有src/java.base/java/lang/Integar.java文件,它是否在您的源目录中?

更新

下面是一个示例项目,演示了如何对java.lang.Integer进行阴影处理:https://dl.dropbox.com/s/6swet2k89vukxbm/patch.zip

编译:

javac --patch-module java.base=src -d mypatches/java.base src/java.base/java/lang/Integer.java
javac --patch-module java.base=mypatches/java.base -d target src/main/java/com/example/MyInteger.java src/main/java/com/example/RunMe.java

运行:

java --patch-module java.base=mypatches/java.base -classpath target com.example.RunMe

相关内容

最新更新