Как вы можете принудительно перекомпилировать JSPS в JBoss 4.2? - PullRequest
7 голосов
/ 04 июня 2009

Я столкнулся с этим неприятным поведением на 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 являются частью войны, которая является частью уха. В ухе есть все классы, в банке.

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

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

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

Ответы [ 6 ]

11 голосов
/ 12 июня 2009

Если 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.

1 голос
/ 07 июня 2009

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

Не тонко, но это сделало бы работу.

1 голос
/ 05 июня 2009

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

0 голосов
/ 12 июня 2009

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

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

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

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

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

0 голосов
/ 10 июня 2009

Некоторые контейнеры 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

0 голосов
/ 09 июня 2009

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

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

См. Подробности о запуске задачи прекомпиляции:

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

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

...