2016-07-06 42 views
0

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

如何解决此问题?我只能看到getResource()返回null;但我找不到为什么它返回null

我检查了由Class.getResourceAsStream()返回的未关闭流,但我没有调用它。 (虽然,我的一个库可能...)我也检查了FileInputStreams没有被关闭,但我还没有找到任何。 (FileInputStreams在这种情况下仍然可用。)

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

+0

我想通过启动反编译有问题的类,调用它们相同的方法,并记录结果。首先,我会记录'Class.getClassLoader0()','Class.getClassLoader0()。getResource()','Class.getClassLoader0()。getParent()。getResource()','Class.getClassLoader0() .getBootstrapResource()'和'Class.getClassLoader0()。findResource()'(其中大部分只能通过反射访问) - 当然,在.getResource()停止工作之前和之后比较它们的输出。 – Siguza

+0

@Siguza谢谢!我会尽力,并在几周内回复。 – alexantd

回答

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-与资源泄漏:

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