getResourceAsStream没有加载资源

时间:2010-03-22 17:05:08

标签: java

我目前正在处理的项目使用.jar文件中包含的旧应用程序。此应用程序的职责之一是在更改配置文件时更新数据库。每次我尝试运行此文件(这是一个简单的Ant任务扩展)时,我都会在过程的早期抛出异常。我反编译了负责的Java文件,发现抛出的异常发生在这里。我不知道是什么问题,因为“hibernate.cfg.xml”包含在与.class抛出异常相同的.jar文件中。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream in = loader.getResourceAsStream("hibernate.cfg.xml");
if (in == null) {
  throw new RuntimeException("Couldn't find built in hibernate config");
}

如果有人有任何想法,甚至指出我正确的方向,我将不胜感激。

当然,任何解决方案都必须是外部的,因为客户已经在生产中使用了这个程序版本。

5 个答案:

答案 0 :(得分:3)

你是从root目录加载的吗?你需要“/hibernate.cfg.xml”而不只是hibernate.cfg.xml吗?

答案 1 :(得分:2)

getResourceAsStream()期望该文件与作为ClassLoader的原点的Class位于同一个包中。您的文件是否在正确的包裹中?

卫生署。没有完全阅读这个问题。请忽略这一点。

答案 2 :(得分:1)

InputStream in = YourClass.class..getResourceAsStream("hibernate.cfg.xml");

如果类与cfg文件位于同一个jar中,这将起作用。

修改 如果无法重建应用程序,则需要将jar添加到bootstrap类加载器。这非常难看。 你可以通过运行jvm来实现它(使用精确的参数,你可能需要从jre中添加rt.jar)。

-Xbootclasspath your.jar

你的问题是代码是使用加载Thread类的类加载器,这很可能是bootstrap类加载器。并且您现在处于一个更复杂的环境(应用服务器?),它使用不同的类加载器加载您的jar。所以bootstrap类加载器找不到你的资源。

答案 3 :(得分:0)

类加载器可能无法打开jar文件中包含的文件。尝试以下两种方法之一:1)尝试解压缩jar文件并从文件系统运行它,或者2)如果jar清单有一个ClassPath条目,请尝试将hibernate.cfg.xml解压缩到类路径中的目录中,看看是否有运行。

答案 4 :(得分:0)

显然,hibernate.cfg.xml文件不在JAR文件的源根目录中,而是放在包中。您还需要在资源名称中指定包路径。