这就是我正在做的事情:
现在,如果我从提取的src文件夹中复制Runtime.java并使用javac.exe进行编译而不进行任何修改,然后将其放入解压缩的rt文件夹中,最后使用jar.exe将所有内容放回到jar文件中,一切按预期工作。 JRE运行良好。
但是,如果我对Runtime.java进行最轻微的更改并将其编译并将其放入rt.jar,那么只要我尝试启动它,JRE就会崩溃。这是导致无声崩溃的轻微变化的示例:
/** Don't let anyone else instantiate this class */
private Runtime() {
System.out.println("This is a test.");
}
而不是:
/** Don't let anyone else instantiate this class */
private Runtime() {}
有人能告诉我为什么这会导致我的JRE崩溃吗?
提前致谢。
答案 0 :(得分:7)
在System.out
构造函数运行时,Runtime()
可能尚未初始化。通常控制台输出不被视为“轻微”改变,但在错误的时间它可以调用太多可能根本没有设置的东西。
答案 1 :(得分:2)
你这样做是错的。您无法在一开始就分发修改后的JRE,因此它仅在您的组织内部有用。安装SecurityManager并且不要向您的代码库授予您试图防范的任何RuntimePermissions。
答案 2 :(得分:2)
@Tom - 我建议你不要试图这样做:
在不违反Sun二进制许可证的情况下,您无法分发修改后的rt.jar
文件。
即使你这样做,你也不会被称为Java。
正如您所发现的,进行更改时会出现许多复杂情况,尤其是当这些更改可能会干扰JVM的幕后初始化时。当初始化过程中出现问题时,JVM通常无法以可理解的方式报告问题。
如果您成功地为一个JRE修改了rt.jar
,则无法保证相同的黑客适用于其他版本。
在正确的思想中,任何人都不会故意在生产应用中使用经过修改的JVM(特别是由第三方修改过的JVM)。
编辑:根据您的其他问题判断,我猜您正在尝试使用自定义启动器对某些第三方Java应用程序进行逆向工程或修改。如果您提供了有关您真正想要做的事情的更多信息,我们可能会建议采用正确方式来做...而不是使用“绝望措施”,例如修改JRE。 / p>
答案 3 :(得分:1)
这很奇怪,因为我在过去的rt.jar中使用了很多类来做同样的技巧。
您能为我们提供崩溃的流程输出吗?