2013-03-26 2 views
3

Tomcat 6.0.35의 두 웹 응용 프로그램에 필요한 라이브러리 (jar 파일)가 있습니다. jar 파일의 클래스 중 하나는 네이티브 라이브러리를 실행해야합니다. 예상대로 두 개의 응용 프로그램을 동시에 deplayed 경우Tomcat의 여러 웹 응용 프로그램에서 공유 네이티브 라이브러리를 처리하는 방법

, 나는 예외

 
java.lang.UnsatisfiedLinkError: Native Library my-native-library.so 
already loaded in another classloader 

을 얻고있다. jar 파일 내에서

는, 네이티브 라이브러리는 정적 블록

 
static 
{ 
    try 
    {   
     System.loadLibrary("my-native-library.so"); 

    } catch (UnsatisfiedLinkError e) 
    { 
     e.printStackTrace(); 
    } 
} 

및 네이티브 라이브러리를 사용하여 XML을 사용하여 구성 할 수있는 클래스를 사용하여로드됩니다.

jar 라이브러리는 우리가 만든 검색 엔진이므로 필요한 경우 다시 빌드 할 수 있습니다.

제 질문은 Tomcat에게 my-native-library.so가 다른 웹 응용 프로그램에 의해로드되었고이 응용 프로그램에 대해 정적 블록이 무시 될 수 있음을 어떻게 알 수 있습니까?

편집 : jar 라이브러리와 웹 응용 프로그램 모두 maven을 사용하고 있습니다.

감사합니다.

편집 : 내 이해함으로써이 :

검색 엔진 라이브러리는 단지 라이브러리로 구축 할 수있는 내-네이티브 library.jar 파일이 필요합니다. 그런 다음 검색 엔진 jar 라이브러리가 저장소에서 호스팅되고 maven을 사용하여 웹 응용 프로그램에 빌드됩니다. 서버가 시작되면 LD_LIBRARY_PATH 및 공유 lib 경로가있는 JAVA_OPTS가 노출되고 서버는 my-native-library.so를 한 번만로드 할 수 있습니다. 그러나 두 웹 응용 프로그램에는 검색 엔진 jar가 포함되어 있으며 my-native-library.jar은 WEB_INF/lib 및 예외에 있습니다.

WEB_INF/lib에서 my-native-library.jar을 제거하려면 필요한 종속성 (my-native-library.jar)없이 검색 엔진 라이브러리를 다시 빌드해야합니다.

+0

. 나는 [여기] (http://stackoverflow.com/questions/3724421/native-library-already-loaded-in-another-classloader) 시작하는 것이 좋습니다 것입니다. – Perception

답변

1

그런 경우 시스템에서 한 번만로드 될 수 있도록 Tomcat의 공유 클래스 로더에서 라이브러리를로드합니다. 자세한 내용은 Tomcat이 클래스 로더의 문서를 봐 :

좋은 정보하지만 허용 답변이 질문의 몇 DUPS가있다

http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html

+1

감사합니다 커트, 나는 $ {catalina.base}/shared/lib (2)에 my-native-library.so를 복사 해 보았습니다. my-native-library.jar를 $ {catalina.base}/(3) catalina.properties 공유 클래스 로더를 shared.loader = $ {catalina.base}/shared/lib (4) add -Djava.library.path = "/ home/me/apache-tomcat-6.0.35/eclipse에 "shared/lib"인수를 제공합니다. Howeve, 나는 아직도 같은 예외를 받고있다. 내가 놓친 게 있니? – user200340

+0

게시하는 단계가 올바르게 보입니다. 그러나 "다른 클래스 로더에로드 된 라이브러리"를 가져 오는 것은로드가 두 번 이상로드되고 있음을 증명합니다. libray가 WEB-INF/lib o WEB-INF/classes 디렉토리 아래에 있지 않은지, 그리고 웹 응용 프로그램이 라이브러리를로드하는 사용자 정의 클래스 로더를 사용하지 않는지 확인하십시오. 클래스 로더 문제는 매우 복잡하고 문제를 해결하기 어려울 수 있습니다. – Kurt

관련 문제