클래스 대신 JAR 파일을 사용하는 Tomcat 배포 문제
문제
우리는 Tomcat 5.5에 전쟁 파일을 배포하고 있으며 Web-Inf Classs가 .classes 파일을 포함하는 경우 잘 작동하지만 .Classes가 포함 된 .jar 파일을 Web-Inf lib로 이동하면 런타임에 예외가 생깁니다. java.lang.nosuchmethoderror를 불평하지만 .jar 파일의 기존 클래스 파일은 클래스가 포함되어 있으며 메소드는 종료됩니다!
이에 대한 도움을 주시면 감사하겠습니다.
해결책
이것은 계급 갈등으로 인해 발생할 수 있습니다. 어딘가에 오래된 버전의 클래스가 없는지 확인하십시오 (Tomcat의 공유 폴더, Web-Inf/Classes, Web-Inf/Lib). 이 경우 실제로 어떤 클래스 Tomcat을로드할지 알 수 없습니다. 방법없이 하나를 선택하면 경험하는 예외가 발생합니다.
다른 팁
ClassNotFoundError가 아닌 Nosuchmethoderror를 받고 있기 때문에 JAR 파일 외부의 구식 클래스가 있음을 의미합니다. 당신은 그것을 찾고 제거해야합니다.
이것은 방어 적으로 클래스 클로린입니다. http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#class%20Definitions
보시다시피 Web-INF/LIB를 비교하는 Web-Inf/클래스에서 클래스의 우선 순위가 더 높습니다. 같은 이름 (및 패키지)의 두 클래스가 있습니다. 그들 중 하나가 클래스 폴더에있을 때 우선 순위가 높아집니다. 둘 다 Lib 폴더에있을 때 두 번째는 먼저 얻는다 (항아리는 알파베이스 순서를 기준으로 우선 순위를 갖는다)
이것은 당신의 상황을 설명 할 수 있습니다.
도움이되기를 바랍니다 -Yonatan
웹 애플리케이션의 관점에서 클래스 또는 리소스 로딩은 다음 리포지토리 에서이 순서대로 나타납니다.
JVM의 부트 스트랩 클래스
시스템 클래스 로더 클래스 (위에서 설명)
/웹 응용 프로그램의/Web-Inf/클래스
웹 응용 프로그램의 /web-inf/lib/* .jar
공통 클래스 로더 클래스 (위에서 설명)
"Common Class Loader"에 의해 검색된 위치는 Common.Loader 속성에 의해 $ catalina_base/conf/catalina.properties로 정의됩니다. 여기에서 공유 위치를 활성화/정의합니다.
shared.loader = $ {catalina.base}/shared/classes, $ {catalina.base}/shared/lib/*. jar
위의 순서는 당신이 직면 한 문제에 대한 더 많은 통찰력을 제공합니다.