이 잘못된 클래스 로더 계층 구조를 어떻게 얻을 수 있습니까?
-
06-07-2019 - |
문제
IPlanet의 Java Application Server를 실행합니다. commons-logging-1.0.4.jar
.
내 응용 프로그램 중 하나가 호출 할 때까지 괜찮습니다 AuthSSLProtocolSocketFactory
이것은 또 다른 Apache 라이브러리입니다 commons-logging
.
JVM ClassPath에 항아리를 넣고이 오류를 얻습니다.
Invalid class loader hierarchy. You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy....
그것은 것 같습니다 commons-logger
다른 클래스 로더에 두 가지 인스턴스가로드되는 것을 좋아하지 않습니다. Application Server에 처음으로로드하는 자체 클래스 로더가 있다고 가정합니다 (언급하는 AppServer 구성을 찾을 수는 없지만 응용 프로그램이로드 할 때 두 번째로로드 할 때는 예외가 발생합니다.
웹 서버를 변경할 수 없으며 Apache 라이브러리를 변경할 수 없습니다. 제안?
해결책
ClassPath에 커먼즈를 기록하고 있습니까? 당신은 JVM ClassPath를 말했습니다. 그래서 나는 당신이 iPlanet을 시작할 때 명령 줄에 그것을 지정한다고 가정합니다. J2EE 앱에서 JARS를로드하는 것이 권장되는 방법이 아닙니다.
가장 쉬운 것은 Apache Library가 iPlanet과 함께 제공되는 Commons Logging Jar를 사용하도록하는 것입니다. Commons-logging.jar를 웹 -inf/lib dir 또는 classpath 설정에 넣지 말고 iPlanet 하나를 자동으로 선택해야합니다.
다른 팁
보세요 SLF4J.
또한, http://www.qos.ch/logging/classloader.jsp 도움이 될 것입니다.
IPLANET에 익숙하지는 않지만 WebSphere에서는 응용 프로그램 클래스로드 정책을 parent_last로 설정할 수 있습니다. 그런 다음 부모를보기 전에 응용 프로그램 클래스 로더의 모든 것을로드합니다. 비슷한 설정이 있다고 가정하면 이런 종류의 문제를 해결해야합니다.
이것은 자신의 응용 프로그램에 모든 종속성을 제공해야한다는 것을 의미합니다 (어쨌든 모범 사례).