Как вы можете принудительно перекомпилировать jsp в JBoss 4.2?

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

  •  11-09-2019
  •  | 
  •  

Вопрос

Я столкнулся с этим неприятным поведением в JBoss 4.2 в QA, и я хочу пресечь это в зародыше, прежде чем мы запустим производство и найдем какой-нибудь другой угловой вариант.

jsp вызывает метод, который имел следующую сигнатуру:

 public void methodName(String arg)

Это было изменено на:

 public void methodName(String arg, Object... args)

Ранее существовавший JSP вызвал этот метод через:

 methodName("param");

При развертывании измененного кода JBoss не перекомпилировал JSP, и это вызвало сбой в QA.Добавление глупого комментария к jsp устранило проблему (JBoss распознал, что JSP изменился, и перекомпилировал его).

Есть ли в JBoss настройка для принудительной перекомпиляции JSP при перезапуске?

Редактировать:Чтобы прояснить некоторые моменты в ответе, установка заключается в том, что JSP являются частью war, которая является частью ear.Ухо содержит в себе все классы, в банке.

Что касается желания предварительной компиляции, если система не считает, что jsp нуждается в компиляции, будет ли предварительная компиляция принудительной перекомпиляции?Это так не кажется.Ошибка здесь не является ошибкой соответствия, это ошибка вызова метода из-за "измененной" (на уровне байтового кода, на самом деле не на уровне кода) сигнатуры метода.

Добавление:Обратите внимание, что недавно мы столкнулись в рабочей среде с тем, что даже при установленном флаге принятого ответа JSP не перекомпилировался, хотя JSP фактически изменился.Там была серьезная ошибка, но, несмотря на это, JBoss завершал работу в обычном режиме.На данный момент это становится старой версией JBoss, но если вы все еще используете ее, удаление содержимого каталогов work и tmp - единственный способ убедиться в этом.

Я не меняю общепринятый ответ просто потому, что он действительно подходит к сути вопроса.Ошибки JBoss - это своего рода отдельная проблема.

Это было полезно?

Решение

Если JSP являются частью WAR, которая является частью EAR, который развертывается как jar, тогда мне не ясно, почему ваши JSP не перекомпилируются.Разве JSP в файле war не имеют более новых временных меток, чем их файлы классов, скомпилированные JBoss из последнего развертывания?Если нет, не могли бы вы прикоснуться к JSP как к части создания WAR / EAR перед развертыванием.[Я имею в виду использование команды Unix "touch", а не прикосновение вручную к каждому JSP-файлу.]

В качестве альтернативы, параметр DeleteWorkDirOnContextDestroy в $JBOSS/server/default/deploy/jboss-web.deployer/META-INF/jboss-service.xml может быть тем, что вы ищете.По умолчанию оно равно false, но установка для него значения true может быть тем, что вам нужно.Я думаю, что это должно удалить файлы классов JSP при повторном развертывании, чтобы они были воссозданы при первом доступе к каждому JSP.

Видишь https://jira.jboss.org/jira/browse/JBAS-3358 для получения дополнительной информации.

Другие советы

Я не знаю о настройке, но удаление сгенерированного файла класса Java в рабочем каталоге вашего экземпляра JBoss приведет к перекомпиляции JSP при следующем его вызове.

Вы могли бы изменить сценарии запуска JBoss, чтобы явно удалить каталоги "tmp" и / или "work", где хранятся скомпилированные JSP.Тогда у JBoss не было бы другого выбора, кроме как перекомпилировать их все.

Не слишком тонко, но это сделало бы свое дело.

Одним из вариантов для вас было бы предварительно скомпилировать все ваши jsp во время сборки.Это быстро выявило бы любые ошибки компиляции.

Вы также могли бы сделать это в production - ускорив первый доступ, но у меня такое чувство, что вы хотите этого больше для этапа контроля качества, чем для чего-либо еще.Если это так, вы могли бы добавить этап предварительной компиляции к вашей фазе тестирования в выбранном вами инструменте сборки - и, таким образом, в вашу среду CI.Это обеспечило бы гарантию того, что jsp, которые не компилируются, не выйдут из теста.

Смотрите это для получения подробной информации о выполнении задачи предварительной компиляции:

Конфигурация Jboss Jasper от Jboss

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

Некоторые контейнеры JSP (согласно разделу 8.4.2 спецификации JSP 1.2) поддерживают возможность предварительной компиляции страницы JSP.

Чтобы предварительно скомпилировать страницу JSP, обратитесь к странице со строкой запроса ?jsp_precompile

http://hostname.com/mywebapp/mypage.jsp?jsp_precompile

Страница JSP не будет выполнена.Если контейнер поддерживает предварительную компиляцию, страница JSP будет скомпилирована при необходимости.

Смотрите также http://www.rgagnon.com/javadetails/java-0414.html

Паблоджим находится на правильном пути.Вам просто нужно немного больше информации, чтобы получить полное представление о том, что происходит.Вот как я это понимаю.

В prod вы изменили jsp, который требует перекомпиляции других jsp.Для того чтобы они были перекомпилированы, должна произойти одна из двух вещей

  1. Скомпилированная версия jsp должна быть удалена.
  2. Сам jsp должен быть изменен (или даже если он "затронут" - дата изменения обновляется)

Если вам все еще нужно убедиться, что все ваши jsp работают, все они должны быть предварительно скомпилировано с использованием ant-задачи.это также позволяет вам развернуть файл war с предварительно скомпилированными jsp в файле war.Это должно решить вашу проблему.

Если ваши файлы развернуты не в файле war, а в развернутом формате, вам следует серьезно подумайте об упаковке вашего веб-приложения в файле war для развертывания.Это делает его удобным пакетом для развертывания в разных средах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top