패키지 웹 애플리케이션에서 JSP-API 및 Servlet-API 항아리로드를위한 응용 프로그램 서버 동작을 우선

StackOverflow https://stackoverflow.com/questions/325171

문제

특정 버전의 JSP-APIAND Servlet-API JAR 파일로 구축 및 패키지가 있습니다. 이제 Tomcat, Weblogic 등과 같은 애플리케이션 서버에 웹 프로젝트를 배포 할 때이 항아리를로드하기를 원합니다.

내가 Tomcat에서 본 동작은이 API의 패키지 버전이 범죄 클래스와 함께로드되지 않는다는 메시지를 제공한다는 것입니다.

이러한 서버 설정이나 동작을 무시할 수있는 방법이 있습니까?

내 우려는 서버의 기본 동작을 보관하면 서버 또는 동일한 앱 서버의 다른 버전에서 다른 동작을 허용 할 수 있다는 것입니다.

도움이 되었습니까?

해결책

  1. 이 웹 앱을 설치하려는 서버를 제어 할 수있는 경우 핵심 항아리를 귀하의 것으로 바꿀 수 있습니다.
  2. 또한 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의 핵심이며 버전은 존재하는 일부 기능에 따라 다릅니다. 변경되면 엔진이 작동하지 않습니다.

내가 보여주는 솔루션은 하나 또는 두 개의 클래스의 동작을 변경하지만 전체 시스템을 대체하지는 않습니다.

따라서 유일한 옵션은 다음과 같습니다.

  1. 서블릿 사양을 충족하는 서블릿 컨테이너에서 실행 앱 업그레이드
  2. 새 사양에 따라 테스트하십시오. 가능성은 (그리고 비 공개 클래스에 링크하지 않은 경우) 앱이 여전히 작동합니다.
  3. (나는 과거에 이것을했다) 정확히 필요한 클래스가있는 새 항아리를 만듭니다 (앱이 잘 실행하기 위해 하나의 클래스 만 있으면 해당 클래스 만 컨테이너로 선출하십시오.

테스트 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 스타트 업

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