2016-07-06 2 views
0

Class.getResource()을 사용하여 장기 실행 Java 응용 프로그램의 jar 파일을로드합니다. 그것은 잘 작동합니다. 그러나 앱이 오랫동안 실행 된 후에는 null을 반환하기 시작합니다.장시간 실행 후 Class.getResource()가 null을 반환합니다.

어떻게 해결해야합니까? 볼 수있는 것은 이 반환하는 예외 인 경우입니다. null; 그러나 나는 을 발견 할 수 없다. 왜이 반환되는지는 null이다.

Class.getResourceAsStream()에 의해 반환 된 폐쇄되지 않은 스트림을 확인했지만이를 호출하지 않습니다. (비록 내 라이브러리 중 하나는 ...) 나는 닫히지 않은 FileInputStreams도 확인했지만 아무 것도 찾지 못했습니다. 이 문제가 발생하는 동안 FileInputStreams는 계속 사용할 수 있습니다.

편집 :이 문제는 this one과 같은 것으로 보입니다. 또한 possibly related.

+0

을 나는 URL.openStream() 리턴 한 InputStream로부터 MANIFEST.MF 중 버전을 읽고 있던 코드를했다 문제의 클래스를 디 컴파일하고, 메소드와 동일한 메소드를 호출하고, 결과를 로깅합니다. 먼저, Class.getClassLoader0(), Class.getClassLoader0(), getResource(), Class.getClassLoader0(). getParent(). getResource(), Class.getClassLoader0() .getBootstrapResource()'와'Class.getClassLoader0(). findResource()'(대부분 리플렉션에 의해서만 접근 가능) - 물론'.getResource() '가 작동을 멈추기 전후에 출력을 비교할 수 있습니다. – Siguza

+0

@Siguza 고마워요! 나는 그것을 시도하고, 몇 주 후에 다시보고 할 것이다. – alexantd

답변

0

해결했습니다.

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); 

시도 -과 - 자원 자바 7을 사용하여 누출 수정 : 나는으로 시작 했죠

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