经过长时间运行后,Class.getResource()返回null

时间:2016-07-06 19:03:23

标签: java

我使用Class.getResource()从长时间运行的Java应用程序的jar中加载文件。它工作正常。但是,在应用程序运行很长时间后,它开始返回null

如何解决此问题?我只能看到getResource()返回null导致的例外情况;但是我无法找到为什么它正在返回null

我检查了Class.getResourceAsStream()返回的未关闭的流,但我没有调用它。 (虽然,我的一个图书馆可能......)我也检查过没有被关闭的FileInputStreams,但我还没找到。 (FileInputStreams在发生这种情况时继续可用。)

编辑:这似乎与this one的问题相同。另外,possibly related

1 个答案:

答案 0 :(得分:0)

我修好了。我的代码是从URL.openStream()返回的InputStream读取MANIFEST.MF中的版本:

String manifestPath = classPath.substring(0, webInfIndex) +
        "/META-INF/MANIFEST.MF";

// DON'T DO THIS!!!
// openStream() returns an InputStream that never gets closed.
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attr = manifest.getMainAttributes();
String version = attr.getValue(Attributes.Name.IMPLEMENTATION_VERSION);

使用Java 7 try-with-resources修复泄漏:

try (InputStream inputStream = new URL(manifestPath).openStream()) {
    Manifest manifest = new Manifest(inputStream);
    Attributes attr = manifest.getMainAttributes();
    String version = attr.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
}