패키지 웹 애플리케이션에서 JSP-API 및 Servlet-API 항아리로드를위한 응용 프로그램 서버 동작을 우선
-
11-07-2019 - |
문제
특정 버전의 JSP-APIAND Servlet-API JAR 파일로 구축 및 패키지가 있습니다. 이제 Tomcat, Weblogic 등과 같은 애플리케이션 서버에 웹 프로젝트를 배포 할 때이 항아리를로드하기를 원합니다.
내가 Tomcat에서 본 동작은이 API의 패키지 버전이 범죄 클래스와 함께로드되지 않는다는 메시지를 제공한다는 것입니다.
이러한 서버 설정이나 동작을 무시할 수있는 방법이 있습니까?
내 우려는 서버의 기본 동작을 보관하면 서버 또는 동일한 앱 서버의 다른 버전에서 다른 동작을 허용 할 수 있다는 것입니다.
해결책
- 이 웹 앱을 설치하려는 서버를 제어 할 수있는 경우 핵심 항아리를 귀하의 것으로 바꿀 수 있습니다.
- 또한 App Server의 시작시 Jars를 준비 할 수 있습니다.
업데이트:
두 번째 부분은 응용 프로그램 서버의 시작 파일을 자체적으로 수정해야합니다.
당면한 설치가 없지만 Dir $ Your_appserv/Bin에 스크립트가 많이 있다고 가정하겠습니다 (.CMD 또는 .SH 파일).
그들 중 일부는 앱 서버를 시작하고 다른 일부는이를 구성하는 데 도움이됩니다.
명령 줄이 다음과 같이 보이는 방식으로 그 중 하나를 수정해야합니다.
(Windows 설치를 가정)
java -Xbootclasspath/p:c:\cutomjars\myJar.jar;customjars\myOtherJar.jar ..................... // the rest of the normal command line.
-BootclassPath/P는 항아리를 앱 클래스 경로로 선출합니다.
-BootclassPath/A가 항아리를 앱 Claspath에 추가합니다.
이 옵션을 사용하면 JARS에 지정된 클래스와 JVM의 클래스를 무시할 수 있으므로 원하는 경우 java.lang.string을 대체 할 수 있습니다.
그것은 하나의 접근법입니다. 불행히도 -xbootclasspath는 Sun JVM의 옵션입니다 (Jrockit은 그것을 가지고 있지 않거나 IBM의 VM에 그의 이름이 무엇인지).
모든 확장 장치가있는 폴더를 선언하는 또 다른 옵션이있었습니다. 또한 JRE에는 Ext Directory가 있습니다.
애플리케이션 서버 빈 디렉토리를 자세히 살펴보고 각 스크립트가 사용되는 내용을 알아보십시오.
이 주제에 대한보다 공식적인 설명은 다음과 같습니다. http://java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html
도움이되기를 바랍니다.
BTW, 나는 몇 년 전 Corba 패키지를 veeeery old 버전으로 대체하기 위해 사용합니다. 그래서 이것은 확실히 작동합니다.
다른 팁
명확성을 위해 답을 두 가지로 나누었습니다
TUSHU, 나는 당신을 위해 두 가지 뉴스가 있습니다.
좋은 것은 이전 게시물에서 설명한 단계를 사용하여 Tomcat에서 Servlet API를 2.5에서 2.3으로 교체 할 수 있다는 것입니다 (아래 스크린 샷).
Tomcat은 시작하지 않을 것입니다 (그리고 나는 이것을 전에 추측해야했습니다). 분명합니다. Servlet-Api.jar는 Tomcat의 핵심이며 버전은 존재하는 일부 기능에 따라 다릅니다. 변경되면 엔진이 작동하지 않습니다.
내가 보여주는 솔루션은 하나 또는 두 개의 클래스의 동작을 변경하지만 전체 시스템을 대체하지는 않습니다.
따라서 유일한 옵션은 다음과 같습니다.
- 서블릿 사양을 충족하는 서블릿 컨테이너에서 실행 앱 업그레이드
- 새 사양에 따라 테스트하십시오. 가능성은 (그리고 비 공개 클래스에 링크하지 않은 경우) 앱이 여전히 작동합니다.
- (나는 과거에 이것을했다) 정확히 필요한 클래스가있는 새 항아리를 만듭니다 (앱이 잘 실행하기 위해 하나의 클래스 만 있으면 해당 클래스 만 컨테이너로 선출하십시오.
테스트 JSP는 다음과 같습니다
Servlet version: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>
수정되지 않은 버전의 출력 :
수정되지 않은 버전 http://img89.imageshack.us/img89/9822/87694136ld9.png
수정 된 버전 :
수정 된 버전 http://img241.imageshack.us/img241/7842/863701977v3.png
수정 된 카탈리나 스타트 업의 스크린 샷
diff opuut http://img246.imageshack.us/img246/3333/30172332tp7.png
Tomcat StackTrace
SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.ServletException: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:275)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
jrockit은 -xbootclasspath를 사용할 수 있습니다. 참조 명령 줄 참조
다른 옵션은 사용하는 것입니다
-djava.endorsed.dirs
JVM 스타트 업