2012-02-29 2 views
4

아래 코드는 Tomcat에서 아름답게 작동하지만 getResource (...) 호출은 WebSphere 6.1에서 null을 반환합니다. Thread.currentThread(). getClassLoader() 및 MyClass.class.getClassLoader() - 둘 다 null을 반환합니다.WebSphere 6.1의 클래스 경로에있는 자원의 URL을 올바르게 얻으려면 어떻게해야합니까?

URL url = null; 
    ClassLoader cl = MyClass.class.getClassLoader(); 
    LOG.info("Using class's classloader."); 

    url = cl.getResource("resources/AConfigFile.xml"); 

    if(url == null) { 
     throw new RuntimeException("The ClassLoader returned null for the URL of the " + 
       "the XML Document. This is definitely not right."); 
    } 

는 ... 그리고 나는 또한

URL url = null; 

    url = MyClass.class.getResource("resources/AConfigFile.xml"); 

    if(url == null) { 
     throw new RuntimeException("The ClassLoader returned null for the URL of the " + 
       "the XML Document. This is definitely not right."); 
    } 

이와 무슨 ... 아니 운이를 시도? 클래스 패스에서 리소스에 대한 URL을 올바르게 얻으려면 어떻게해야합니까?

답변

4

차이점은 ClassLoader의 동작 방식이라고 생각합니다. 대신 Class 변형을 사용할 수 있습니까? 내 수업. class.getResource()? 우리는 항상 WebSphere 6.1에서 Class.getResourceAsStream()을 사용합니다.

또는 리소스 경로 앞부분에 슬래시를 붙이십시오.

변형 Class 변형을 사용하면 상대 경로는 MyClass 패키지의 resources 하위 디렉토리에 표시됩니다. 그러나 ClassLoader 변형은 그렇지 않을 수도 있습니다.

+1

클래스 변형을 시도했습니다. 불운. 하지만 문제를 해결하는 선도적 인 슬래시에 돈이 있습니다 ... 지금 다시 테스트 해 보겠습니다. 곧 확인하겠습니다 :) – Jared

1

서블릿 컨테이너 내에서 각각 Class.getResource()Class.getResourceAsStream() 대신 ServletContext.getResource()ServletContext.getResourceAsStream()을 사용해야합니다. 서로 다른 서블릿 컨테이너에서 일관되게 작동하는 경향이 있습니다.

또한 상대 경로가 사용중인 컨텍스트에서 올바른지 다시 한 번 확인하십시오. 절대 경로를 시도하고 더 나은지 확인하십시오.

+0

"이 메소드는 java.lang.Class.getResource와 다른 용도로 사용됩니다. 클래스 로더를 기반으로 리소스를 늘릴 수 있습니다.이 메서드는 클래스 로더를 사용하지 않습니다. 'Class' 메소드는 WebSphere에서 확실히 작동합니다. – dbreaux

+0

@dbreaux :'Class' 메소드는 "작동"할 수도 있지만, 웹 애플리케이션 내에있는 리소스를로드하는 경우에는'ServletContext' 메소드를 사용하는 것이 좋습니다. 그것이 그들이 설계 한 것입니다. 밝혀진 바와 같이, 선도 슬래시는 컨테이너가 자원을 찾고 OP의 문제를 해결하는 데 도움이되었습니다. 하지만 여전히'ServletContext' 메소드로 전환하는 것을 추천합니다. – Asaph

관련 문제