覆盖rt.jar中的单个类

时间:2011-12-08 15:05:32

标签: java classloader java-7

我正在寻找一种从引导类路径rt.jar覆盖类的简洁方法。 原因是OpenJDK7错误http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7104625

此错误的修复程序是一个微不足道的(请参阅链接的邮件列表帖子)更改为sun.awt.X11.XComponentPeer。所以我想知道是否有一种简单的方法可以在我的类路径上覆盖这个受影响的类,而不必重新打包/重建rt.jar(因此修复程序不会在下次自动更新OpenJDK时丢失)。

理想情况下,它也会影响Eclipse ......

我认为java -Djava.system.class.loader=myClassLoader会起作用吗?有没有其他方法可以使用这样的“修补程序”覆盖单个类? (注意:不是在我自己的代码中使用,而是在Java AWT代码中使用)

4 个答案:

答案 0 :(得分:9)

您可以使用VM参数-Xbootclasspath/p将自己的JAR文件与修补后的类一起添加到引导类路径。

答案 1 :(得分:1)

我认为唯一支持的方法是通过替换所需的* .class文件来“修补”rt.jar。 7-Zip可以帮助您轻松完成此任务。

这正是Oracle用他们的FPUpdater工具提供他们的双解析错误修复的原因,这个工具本质上就是一个脚本。 (Some history。)

答案 2 :(得分:1)

我认为您可以尝试使用javaagent 当JVM加载系统类并将其交换给您时,您必须拦截事件

答案 3 :(得分:0)

我认为@ziesemer是正确的,但是当您的应用程序启动时,您可以使用类加载器替换有问题的类。如果你不想担心你下面的JDK更新,这可能会更清晰,尽管你必须将这个引导类加载器代码粘贴到你正在使用的每个应用程序中。