繁体   English   中英

getResourceAsStream没有加载资源

[英]getResourceAsStream not loading resource

我目前正在处理的项目使用.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");
}

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

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

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

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

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

尝试

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

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

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

-Xbootclasspath your.jar

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM