Проблема с classpath в Tomcat 9 и подкаталоге веб-приложения

Как настроить веб-приложение таким образом, чтобы файлы.jsp в подкаталогах могли найти те же классы, что и файлы.jsp в корневом каталоге приложения?

Я переместил старое веб-приложение с сервера tomcat6 на сервер tomcat9. Однако файлы.jsp в подкаталогах приложения больше не могут импортировать Java-классы, которые находятся в WEB-INF/classes. Веб-приложение установлено в виде разнесенного файла войны. Чтобы продемонстрировать проблему, у меня есть файл test.jsp, который просто содержит:

<%@ page import="com.example.serverutils.StringUtil" %>
<%= StringUtil.MILLISECONDS_PER_DAY %>

Этот файл прекрасно компилируется, когда он находится в корневом каталоге приложения. Но если я переместлю test.jsp в подкаталог, он не сможет найти класс StringUtil.

Структура каталогов выглядит следующим образом:

domain\test.jsp
domain\sub\test.jsp
domain\WEB-INF\web.xml
domain\WEB-INF\classes\com\example\serverutils\StringUtil.class

Фактическая регистрируемая ошибка: "Только тип может быть импортирован. Com.example.serverutils.StringUtil разрешает пакет"

2 ответа

Решение

Я выяснил причину проблемы, сравнив настройку приложения в файле server.xml в старом (tomcat6) и новом (tomcat9) каталоге conf.

Конфигурация, которая НЕ работала, имела

   <Host appBase="/path/to/root/of/webapp">
       <Context docBase="">

Но работающая конфигурация имела

   <Host appBase="/path/to/root/of">
       <Context docBase="webapp">

По-видимому, наличие docBase для контекста, установленного на "", вызывает такое поведение. Изменив файл server.xml, чтобы в docBase для контекста было указано имя последнего подкаталога пути, а для appBase элемента Host, установленного на один каталог вверх, была устранена эта проблема.

Ваш вопрос может быть похож на Как включить файл JSP из другой папки

Это может работать с этой структурой:

domain\test.jsp
domain\import_class.jsp
domain\sub\test.jsp
domain\WEB-INF\web.xml
domain\WEB-INF\classes\com\example\serverutils\StringUtil.class

С domain\import_class.jsp содержащий:

<%@ page import="com.example.serverutils.StringUtil" %>

А также domain\sub\test.jsp К относительному пути относятся:

<jsp:include page="../import_class.jsp"></jsp:include>
<%= StringUtil.MILLISECONDS_PER_DAY %>
Другие вопросы по тегам