Переопределение поведения сервера приложений для загрузки jsp-api и servlet-api jar в упакованном веб-приложении

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

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

Могу ли я каким-либо образом переопределить эти настройки или поведение сервера?

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


person Tushu    schedule 28.11.2008    source источник


Ответы (4)


  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 добавляет jar-файлы в claspath приложения

Эта опция позволяет вам переопределить любой класс в 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 очень старой версией. Так что это точно работает.

person OscarRyz    schedule 28.11.2008
comment
Не могли бы вы рассказать об этом немного подробнее? Я бы не хотел заменять серверные банки. - person Tushu; 28.11.2008
comment
На втором ты имеешь в виду? Конечно. - person OscarRyz; 28.11.2008
comment
Мне так и не удалось добиться результата до настоящего времени. - person Tushu; 02.12.2008
comment
Можете ли вы опубликовать несколько ссылок на рассматриваемые банки, а также какой контейнер сервлетов у вас есть? - person OscarRyz; 02.12.2008
comment
Приведенные выше версии файлов jar были загружены из репозитория maven. - person Tushu; 10.12.2008
comment
У меня есть файлы servlet-api-2.4.jar и jsp-api-2.0.jar в моем пакете веб-приложения. Рассматриваемый контейнер сервлета — Tomcat-6.0.18, как вы использовали в своем примере ниже. Я согласен с вашим подходом к загрузке jar при загрузке, но есть ли выход, если я все равно попытаюсь придерживаться своих версий? - person Tushu; 10.12.2008
comment
И JRockit, и IBM имеют опцию -Xbootclasspath. - person staffan; 04.02.2009

Для ясности я разделил ответ на две части

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

Хорошо, что мне удалось заменить 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/86370197ev3.png< /а>

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

вывод различий http://img246.imageshack.us/img246/3333/30172332tp7.png< /а>

Трассировка стека Tomcat

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)
person OscarRyz    schedule 02.12.2008

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

person Kire Haglin    schedule 29.11.2008

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

-Djava.endorsed.dirs

При запуске JVM

person OscarRyz    schedule 09.01.2009