如何解决我们如何使用--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
完成的,但无法正常工作。我已经做了以下事情:
- 删除最终修饰符,并从openjdk-11源重新编译java.base模块
- 添加了
--patch-module java.base=<path-to-my-compiled-java.base-directory>
- 它在
error: cannot inherit from final Integer
上仍然失败。可能我们不能再覆盖JDK源文件的类声明了吗?那太奇怪了。 - 我还尝试将这些类文件添加到jar中,并尝试将所有可能的根目录传递给
--patch-module
参数 - 我尝试从已编译的
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。