我使用Class.getResource()
从长时间运行的Java应用程序的jar中加载文件。它工作正常。但是,在应用程序运行很长时间后,它开始返回null
。
如何解决此问题?我只能看到getResource()
返回null
导致的例外情况;但是我无法找到为什么它正在返回null
。
我检查了Class.getResourceAsStream()
返回的未关闭的流,但我没有调用它。 (虽然,我的一个图书馆可能......)我也检查过没有被关闭的FileInputStreams,但我还没找到。 (FileInputStreams在发生这种情况时继续可用。)
编辑:这似乎与this one的问题相同。另外,possibly related。
答案 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);
}