문제

우리는 현재 응용 프로그램을 생산 환경에서 새로운 데이터 센터로 마이그레이션하는 과정에 있습니다.

  • 현재 생산 환경 : Java 1.4, Java EE 3, 5.1, JSF 2.1
  • 새로운 데이터 센터 환경 : Java 1.5, Java EE 5, 6.1, JSF 2.1
우리의 응용 프로그램은 JSF 2.1에 구축되며 아래 코드가 Ajax 호출 중 하나에 포함되어 있습니다.
request.getSession().getServletContext().getRequestDispatcher(
                    "/results.faces").include(request, response);
그리고 이것은 우리가 문제를 해결하는 곳입니다.

사례 1 : 표준 사양에 따라 귀 구조
. EAR-> WAR-> WEB -INF-> lib-> *.jar (모든 응용 프로그램 특정 항아리는 웹 -inf/lib 아래에 있습니다). 이것은 작동하지 않으며 클래스 로더에서 찾을 수없는 클래스에 대한 예외를 얻는 데 도움이됩니다. 또한 위의 Ajax 호출이 실패합니다 (출력이 생성되지 않음)

사례 2 : 귀에는 루트의 모든 응용 프로그램 JAR 파일이 포함되어 있습니다 (Manifest.mf는 클래스 경로가 수동으로 지정되어 있음).
이 접근법은 완벽하게 작동하며 모든 JAR 파일은 아무런 문제없이로드됩니다. 또한 Ajax 호출도 잘 진행됩니다.

왜 이런 일이 일어날 수 있는지 아이디어.

- 아쉬 쉬

도움이 되었습니까?

해결책

예, Java EE 앱 서버는 다음과 같은 클래스 로더의 계층 구조를 가지고 있기 때문입니다. 첫 번째 부트 스트랩 클래스 로더가 호출됩니다. 다음은 귀 수준의 클래스 로더와 전쟁 수준 클래스 로더입니다. 더 높은 레벨 클래스 로더는 필요한 클래스를 아래에서 찾지 못합니다. 그들이 필요한 것을 찾지 못하면 classNotFoundException이 던져집니다.

따라서 Web-Inf/Lib의 항아리는 귀의 클래스 로더에 보이지 않았습니다. 그 항아리를 움직일 때 문제를 해결합니다. 그것은 모든 항아리가 귀의 모든 전쟁에도 보입니다.

확인하려는 한 가지는 Web.xml 및 기타 파일의 사양입니다. 서블릿과 JSP 사양은 길을 따라 어딘가에 바뀌 었으므로 JSTL과 같은 항아리가 버전 1.0에서 1.1로 갔다. Web.xml 및 모든 항아리가 Java EE 앱 서버에서 지원하는 사양과 일치하는지주의 깊게 확인할 수 있습니다.

불행히도, 앱 서버를 업그레이드하는 것은 귀나 전쟁을 시작하는 것만 큼 쉽지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top