我们如何使用--patch-module从OpenJDK 11覆盖java.base / java.lang.Integer? --patch-module

问题描述

在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. 我尝试从已编译的package-info.class目录中删除模块java.base,并尝试显式添加java.base.java.lang.Integer--add-opens

对于这种特殊用法,docs尚不清楚。

来自maven的整个javac命令(我已经尝试了javac和maven-compiler-plugin):

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中的示例为您的用例建模。注意javac和java都使用--patch-module。

--patch-module

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

-Xbootclasspath / p已被删除,其模块替换是--patch-module选项,以覆盖模块中的类。也可以是 用于扩充模块的内容。 -patch-module 选项是 javac还支持编译模块的代码“好像”部分。

这是一个编译新版本的示例 java.util.concurrent.ConcurrentHashMap 并在运行时使用它:

    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-module目录对齐,即是否有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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...