我正在使用工作 JVM 来做各种事情的应用程序服务器。
工作 jvm 使用 -cp 开关启动并指定包含供应商库和其他重要功能的 JAR 文件。
我有一个非常有趣的问题,其中 jar 文件 CLASSES 正确加载和执行代码,但是任何时候他们尝试访问 jar 文件中的 RESOURCE(特别是使用 getResourceAsStream() 方法),然后它就会爆炸,声称找不到它。我已经验证这些资源肯定存在于正在加载的 JAR 中,事实上,如果我操纵 JAR 以在外部定位资源,它就可以工作。问题是这些都是专有库并且不附带源代码,所以我不得不通过反编译和方法入口断点来完成所有事情。
也许最奇怪的部分是这些库已经好几个月没有改变了,并且一直在其他(包括生产)应用程序服务器中工作。
它们在 JRE 1.6.0_17 上
所以我的问题是
- 为什么带有 -cp 条目的 JVM 能够从 jar 中加载 CLASSES 而不是 RESOURCES
- 此领域中的任何内容是否从 JRE 1.6.0_06 更改为 1.6.0_17(最近已更改)
澄清一下,在 JAR 结构中,这些资源位于 jar 的根目录上,即:
resource.prop
META-INF/Manifest
package/package/class.class
JAR 本身在加载时显然位于类路径中。但是,以下所有内容都解析为 NULL(是的,这让我发疯了,所以我确实尝试了所有 3 个):
Jarclass.getClassLoader().getResourceAsStream("./resource.prop");
Jarclass.getClassLoader().getResourceAsStream("/resource.prop");
Jarclass.getClassLoader().getResourceAsStream("resource.prop");
这看起来类似于无法在所有计算机上访问 JAR 中的资源,但该问题没有解决方案。