2010-03-31 5 views
8

내 클래스 경로에있는 디렉토리에 리소스 파일 모음이있는 경우 ClassLoader.getResources(location)을 사용하여 열거 할 수 있습니다.classpath에서 .jar의 리소스를 어떻게 찾습니까?

예를 들어 클래스 경로에 /mydir/myresource.properties이있는 경우 클래스 로더의 getResources("mydir")을 호출하고 myresource.properties이 포함 된 열거 형을 가져올 수 있습니다.

.jar에 정확히 동일한 리소스를 저장할 때 전화를 걸 때 URL 열거에 아무 것도 표시되지 않습니다. 나는 단지 폴더 구조를 그 폴더를 포함하는 jar 파일로 바꿨다. (webapp이기 때문에 jar 파일은 /WEB-INF/lib에있다.) 또한 getResourceAsStream(location)을 사용하여 다른 리소스를 개별적으로 얻으려는 전화가 여러 개 있으며 모두 잘 작동합니다.

리소스가 .jar에있을 때 리소스를 열거하는 것과 다른 점은 무엇입니까?


업데이트 - 컨테이너 외부의 동작을 재현했습니다. 다음 코드 조각은 dirProperties 오브젝트의 키가 패키지의 자원 이름으로 설정되지만, 패키지가 .jar 인 경우 Properties.load (InputStream) 메소드 중에 NullPointerException을 발생시킵니다.

Properties dirProperties = new Properties(); 
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location)); 

컨테이너 (톰캣 5.5)에 동일한 코드도 예외가 발생하지 않습니다하지만 파일이 .JAR에있을 때 빈 속성 객체를 생성합니다.

+0

이전에는 이러한 차이점을 발견 한 적이 없지만 JAR에 패키지 된 경우 주어진 클래스 로더 구현이 리소스를 URL로 표현할 수없는 상황을 상상할 수 있습니다. 그러나 내가 사용 해본 서버 (Jboss/Tomcat) *는 이것을 할 수 있습니다. – skaffman

답변

0
this.getClass().getClassLoader().getResourceAsStream(location); 
+1

물론 getResources (location) 대신 getResourceAsStream (location)을 사용할 수는 있지만, 놓친 것이 아니라면 문제를 해결하거나 이해하는 데 도움이되지 않습니까? – Brabster

1

내가 정확하게 해결책을 제안하는 당신에게 물어볼 질문을 많이 가지고 있지만, 난 당신이 자원을 찾는 데 도움이 될 수있는이 간단한 단계를 시도하도록 요청할 수 있습니다. 리소스를 찾기 위해 사용중인 클래스 로더가 리소스를 찾을 수 없다고 생각합니다. 그래서 당신은 아래 (주위에 더 많은 작업) 시도 할 수 있습니다 :

  1. 가 JAR의 다른 자원과 함께 클래스를 (예를 들어 ResourceGetter.class)를 간단한 빈 클래스를 만들기
  2. 패키지. 이 클래스를 다른 리소스와 같은 계층 구조의 폴더 계층에 포함 시키십시오. JAR 내부, 예를 들어 :

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. 사용 ResourceGetter.class.getClassLoader() 같이 getResourceAsStream() 또는의 GetResources.()이 리소스 파일을 원하는 코드에서. 당신이 리소스에 액세스 할 수있는 경우

, 당신은 그것을로드하는 클래스 로더를 찾을 수 있습니다 그리고 당신에 문제가 해결할 수 있습니다.

+0

Hey @sugaGenius, 저는 6 년 전 이것을 게시했습니다. 왜 당시이 문제에 관심이 있었는지 또는 컨테이너가 무엇인지 기억할 수 없습니다! +1 도움을 시도하는 것! – Brabster

관련 문제