【发布时间】:2010-01-14 16:53:16
【问题描述】:
我有一些从现有 jar 中读取配置文件的遗留代码,例如:
URL url = SomeClass.class.getResource("/configuration.properties");
// some more code here using url variable
InputStream in = url.openStream();
显然它以前工作过,但是当我执行此代码时,URL 是有效的,但我在第三行得到一个 IOException,说它找不到文件。该 url 类似于“file:jar:c:/path/to/jar/somejar.jar!configuration.properties”,因此它看起来不像是类路径问题 - java 非常清楚在哪里可以找到文件..
上面的代码是 ant 任务的一部分,在执行任务时失败了。
太奇怪了——我将代码和 jar 文件复制到一个单独的类中,它按预期工作,属性文件是可读的。
在某个时候,我将 ant 任务的代码更改为
URL url = SomeClass.class.getResource("/configuration.properties");
// some more code here using url variable
InputStream in = SomeClass.class.getResourceAsStream("/configuration.properties");
现在它可以工作了——直到它在另一个实现了类似访问模式的类中崩溃..
为什么它以前可以工作,为什么现在失败了?我目前看到的唯一区别是,旧版本是使用 java 1.4 完成的,而我现在正在尝试使用 Java 6。
解决方法
今天我在构建服务器上安装了 Java 1.4.2_19 并让 ant 使用它。令我完全失望的是:问题消失了。在我看来,java 1.4.2 可以处理这种类型的 URL,而 Java 1.6 不能(至少在我的上下文/环境中)。
我仍然希望得到解释,尽管我正面临重写部分代码以使用表现更稳定的 Class#getRessourceAsStream 的工作......
【问题讨论】:
-
如果你可以调试它,看看 Java 做了什么会很有趣。随着 Eclipse 执行服务器,一些断点和对 Java 类代码的嗅探也许你可以得到一些东西(或者如果 URL 代码足够复杂的话,只是头疼:)。无论如何,Class#getResourceAsStream 似乎更直接且与环境无关。
-
是的,我必须调试。包括头痛,因为问题只出现在构建服务器上的 hudson 触发的 ant 构建中......但是应该可以将远程调试会话从 Eclipse 连接到该 ant 构建 - 我会随时通知您进度; )
-
如果你想调试它,你可能应该从打印
SomeClass.class.getClassLoader()开始,谁知道呢,它们可能不一样。