Проблема с 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 %>