2014-12-21 3 views
1

아직로드되지 않은 두 번째 JAR에서 리소스 (일반 텍스트 파일)를로드하려고합니다. 이 리소스에는 사용할 두 번째 항아리에 클래스를 나타내는 문자열이 포함됩니다.로드되지 않은 다른 JAR에서 리소스로드

이 리소스를로드하는 올바른 방법을 찾는 데 문제가 있습니다. 이전의 비슷한 질문을 통해 훨씬 더 많은 것을 얻지 못했습니다. 여기에 내가 함께 일하고 있어요 무엇 :

public void readResource() { 
    ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
} 

내가 (A WebappClassLoader되는 것을 포기 끝나는)이 클래스 로더에서 볼 수있는 디렉토리에있는 항아리의 목록이 있습니다 :

jarNames: [com.mysql.jdbc.jar, productivity-common.jar] 
jarPath: /WEB-INF/lib 

내가하려고 클래스 로더를 사용하여 파일을로드, 나는 NullPointerException이 받고 있어요 :

String path = loader.getResource("com/productivity/common/META-INF/providers/hello.txt").getPath(); 

이 작동 할 경우, 내 다음 단계는 InputStream를 사용하여이 파일의 값을 읽고, 새로운을 만들려고 할 것이다 동일한 두 번째 항아리에서 해당 값과 일치하는 클래스의 인스턴스입니다. 내가 읽고있는 것으로부터, 나는 그 클래스에 대한 경로를 사용하고 Class.forName ("value"). newInstance()를 사용 하겠지만, 나도 당연하다고 확신하지는 않는다.

도움을 주시면 감사하겠습니다. 나는 ClassLoader가 어떻게 작동하는지 배우고 (도움이되는 간단한) 프로젝트를 작성하려고 노력 중이다.

+0

파일 경로가 동일합니까? jar 파일에서 com/test/abc.properties를 의미합니까? – kamoor

+0

내 파일은 하나의 항아리에만 있습니다. 첫 번째 jar 패키지는 리소스가없는 com.test.forecaster입니다. 이것은 Tomcat 호출을 통해 webapp에 연결되는 주요 항아리입니다. 두 번째 항아리는 src/main/resources/META-INF/providers/hello.txt가 들어있는 com.productivity.common입니다. – giraffee

+0

아래 질문에 답했습니다. 까다로운 부분은 getResources에서 올바른 디렉토리 구조를 제공하는 것입니다. jar 파일을 열고 경로를 찾으십시오. 여기서 나의 가정은 "META-INF/providers/hello.txt"입니다. – kamoor

답변

1

"spring/label.properties"라는 이름의 두 개의 리소스 파일이 서로 다른 두 개의 jar 파일에 저장되어 있다고 가정 해 보겠습니다.

다음 코드를 사용하여 클래스 경로에서 모든 파일 목록을 찾은 다음 경로를 기준으로 필터링 할 수 있습니다.

 Enumeration<URL> en = this.getClass().getClassLoader().getResources("spring/label.properties"); 
    while(en.hasMoreElements()){ 
     URL url = en.nextElement(); 
     //Print all path to visualize the path 
     System.out.println(url.getPath()); 
     if(url.getPath().contains("my-jar")){ // This can be jar name 
      BufferedReader reader = new BufferedReader(new InputStreamReader(en.nextElement().openStream())); 
      String str = null; 
      while((str = reader.readLine())!=null){ 
       // Now you can do anything with the content. 
       System.out.println(str); 
      } 
     } 
    } 

그게 도움이 되나요?

+0

'en'이 비어있게됩니다. 나는 현재 클래스의 클래스 로더뿐만 아니라 현재 쓰레드의 컨텍스트 클래스 로더 인 "META-INF/providers/hello.txt"를 가리키는 getResources()를 시도했다. 심지어 같은 텍스트 파일을 내 'main'jar 파일에 추가했다. WebContent/META-INF/providers/hello.txt 경로가 getResources()에서 경로를 변경 했는데도 여전히 빈 열거 형이 발생합니다 – giraffee

+0

jar 파일을 열어 내용을 검사 해 보셨습니까? – kamoor

+0

와우 ... 맞았습니다. 모두 함께, 분명히 내가 내 리소스 파일을 추가하기 전에 JAR에 내 두 번째 프로젝트를 내보낼 때. 한숨 .. 감사합니다! – giraffee

관련 문제