Как tomcat генерирует файлы своей рабочей директории * _jsp.java, и что может заставить его генерировать нулевые байты? - PullRequest
0 голосов
/ 11 января 2012

Мой вопрос связан с обновлением с 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 может привести к очевидному решению, объяснимой проблеме или, по крайней мере, к ответу типа «Это разработано. Пожалуйста, выполните рефакторинг».

1 Ответ

0 голосов
/ 16 августа 2016

У нас была похожая проблема, и мы нашли причину в нашем контексте: мы запускали тест на селен в нашей среде непрерывной интеграции сразу после запуска tomcat, поэтому развертывание еще не завершено, и это каким-то образом привело к длине 0 (пусто) Файлы * jsp.java и * jsp.class. Интересно, что это произошло для всех сборок, потому что развертывание всегда занимало больше времени (около 1 м), чем то, что потребовалось для запуска тестов.

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

...