Переопределение поведения сервера приложений для загрузки jsp-api и servlet-api jars в упакованном веб-приложении - PullRequest
3 голосов
/ 28 ноября 2008

У меня есть проект, созданный и упакованный с определенной версией jar-файлов jsp-apiand servlet-api. Теперь я хочу, чтобы эти файлы jar загружались при развертывании веб-проекта на любом сервере приложений, например tomcat, WAS, Weblogic и т. Д.

Поведение, которое я видел на tomcat, заключается в том, что он выдает сообщения о том, что упакованная версия этих API-файлов не загружается вместе с классом-нарушителем.

Можно ли как-то переопределить эти настройки или поведение сервера?

Меня беспокоит то, что разрешение поведения сервера по умолчанию может разрешить различное поведение на разных серверах или даже на разных версиях одного и того же сервера приложений.

Ответы [ 4 ]

3 голосов
/ 28 ноября 2008
  1. Если у вас есть контроль над сервером, на котором вы хотите установить это веб-приложение, вы можете заменить основные файлы на свои.
  2. Кроме того, вы можете добавить баночки при запуске сервера приложений.

Обновление:

Что касается второй части, вам нужно изменить сам файл запуска сервера приложений.

У меня нет установки под рукой, но давайте предположим, что в директории $ 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 добавляет файлы jar к пути к классу приложения

-bootclasspath / a добавляет файлы jas к класпату приложения

Эта опция позволяет вам переопределить любой класс в JVM с классами, указанными в jar, так что вы можете даже заменить java.lang.String, если хотите.

Это один из подходов. К сожалению, -Xbootclasspath является опцией для Sun JVM (то есть у JRockit его нет, как и у виртуальной машины IBM, как его зовут)

Был еще один вариант, где вы объявляете папку, в которой находятся все расширения. Кроме того, в JRE есть каталог ext.

Погрузитесь в каталог bin вашего сервера приложений и выясните, для чего используется каждый скрипт, я уверен, что вы справитесь.

Вот более формальное объяснение этой темы: http://java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html

Надеюсь, это поможет.

Кстати, я использую это несколько лет назад, чтобы заменить пакет CORBA старой версией. Так что это работает точно.

1 голос
/ 02 декабря 2008

Я разбил ответ на два для ясности

Тушу, у меня для тебя две новости.

Хорошо, что мне удалось заменить api сервлета от 2.5 до 2.3 в моем коте, используя шаги, которые я описал в моем предыдущем посте (скриншоты ниже)

Плохой новый (и я должен был догадаться об этом раньше) Tomcat не запустится. Очевидно, servlet-api.jar является ядром Tomcat, и версия зависит от некоторых имеющихся там возможностей. Если это изменить, двигатель не будет работать.

Решение, которое я вам показал, работает для изменения поведения одного или двух классов, но не для замены всей системы.

Итак, у вас есть только следующие варианты:

  1. Запускать контейнер сервлета, который соответствует спецификации вашего сервлета Обновите ваше приложение
  2. Протестируйте как есть на новой спецификации. Скорее всего, (и если вы не ссылались на закрытые классы) ваше приложение все еще работает
  3. (я делал это в прошлом) создайте новый jar с точно необходимыми классами (скажем, вашему приложению нужен только один класс, чтобы хорошо работать), а затем добавьте этот класс в контейнер.

Вот тест jsp

Servlet version: <%=application.getMajorVersion()%>.<%=application.getMinorVersion()%>

Вывод с неизмененной версией:

неизмененная версия http://img89.imageshack.us/img89/9822/87694136ld9.png

Модифицированная версия:

модифицированная версия http://img241.imageshack.us/img241/7842/86370197ev3.png

Скриншот модифицированного запуска catalina

diff ouput 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)
0 голосов
/ 09 января 2009

Другой вариант - использовать

-Djava.endorsed.dirs

После запуска JVM

0 голосов
/ 29 ноября 2008

JRockit может использовать -Xbootclasspath. См. справочник по командной строке

...