Мой вопрос связан с обновлением с Tomcat 6.0.18 до 7.0.22, хотя, похоже, проблема возникает в других версиях. Я подозреваю, что это связано с моим неправильным пониманием основного поведения Tomcat, хотя после поиска документации Tomcat , предыдущих SO вопросов о Tomcat (слишком много, чтобы их можно было эффективно цитировать), а также различных сообщений в блогах из разных источников опять-таки не по теме, чтобы было достойно упоминания), я в растерянности.
Приложение, с которым я работаю, - это растянутое Java-приложение с сотнями JSP-страниц. В прошлом на Tomcat 6 у нас не было проблем с их компиляцией во время выполнения. Они (по большей части) правильно генерируют файлы *_jsp.java
в рабочем каталоге Tomcat, и компиляция в файлы * .class работает как положено. Те, которые не являются устаревшим кодом, который не используется в рабочих настройках, все еще находятся в кодовой базе по причинам, которые не стоит здесь указывать.
При переходе на Tomcat 7, в частности 7.0.22, я столкнулся с неожиданным поведением. Подавляющее большинство страниц JSP компилируется (как в код .java
, так и в связанные с ними файлы .class
) просто в рабочем каталоге. Некоторые, однако, генерируют 0-байтовые .java
файлы.
Моим первым решением этой проблемы было: «Что-то в компиляции Tomcat JSP изменилось между двумя версиями, кроме самой спецификации JSP». После поиска в документах ничего не казалось очевидным, поэтому я попытался предварительно скомпилировать все jsps с помощью Ant .
Это удалось, если речь шла о преобразовании в файлы .java с использованием чрезвычайно простого скрипта ant:
<project name="myApp" default="all" basedir=".">
<import file="${tomcat.home}/bin/catalina-tasks.xml"/>
<target name="jspc">
<jasper
validateXml="false"
uriroot="${webapp.home}"
webXmlFragment="${webapp.home}/WEB-INF/generated_web.xml"
outputDir="${webapp.home}/WEB-INF/classes"
failonerror="false" />
</target>
<target name="all" depends="jspc">
</target>
</project>
*_jsp.java
файлы были правильно сгенерированы jasper , а 0-байтовые файлы, которые вызывали проблемы при компиляции Tomcat в рабочий каталог, компилировались должным образом с помощью этого метода. Было несколько незначительных различий по сравнению с файлами *_jsp.java
рабочего каталога Tomcat 6, но они, вероятно, связаны с обновлением спецификации JSP между 6 и 7 . К сожалению, наш унаследованный код делает некоторые из полученных .java
файлов не компилируемыми, как правило, в обеих версиях. Чтобы их компилировать с .java
до .class
(в отличие от .jsp
до *_jsp.java
до *_jsp.class
) потребуется глубокий рефакторинг. Таким образом, я не могу следовать настоящей стратегии предварительной компиляции JSP. Tomcat, кажется, обрабатывает эти файлы более разумно, чем мои сценарии, что неудивительно.
Мой вопрос немного шире: что может заставить tomcat генерировать пустые файлы *_jsp.java
в своем рабочем каталоге? Как следствие, каким процессом Tomcat генерирует эти файлы в своем рабочем каталоге, и как это отличается от того, как я могу сгенерировать эти файлы с помощью скрипта Ant? Я подозреваю, что более глубокое понимание поведения ядра Tomcat может привести к очевидному решению, объяснимой проблеме или, по крайней мере, к ответу типа «Это разработано. Пожалуйста, выполните рефакторинг».