Tomcat 9 和 Web 应用程序子目录的类路径问题

Classpath problem with Tomcat 9 and web app subdirectory

如何配置 Web 应用程序,以便子目录中的 .jsp 文件可以找到与应用程序根目录中的 .jsp 文件相同的 classes?

我已将一个旧的 Web 应用程序从 tomcat6 服务器移动到 tomcat9 服务器。但是,应用程序子目录中的 .jsp 文件不再能够导入 WEB-INF/classes 下的 java classes。 Web 应用程序安装为展开的 war 文件。为了演示这个问题,我有一个 test.jsp 文件,其中只包含:

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

此文件在应用程序的根目录中时可以正常编译。但是,如果我将 test.jsp 移动到子目录,则无法找到 StringUtil class.

目录结构如下:

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

记录的实际错误是 "Only a type can be imported. com.example.serverutils.StringUtil resolves to a package"

您的问题可能类似于How to include JSPs file from another folder

它可能适用于这种结构:

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 %>

我通过比较旧 (tomcat6) 和新 (tomcat9) conf 目录中 server.xml 文件中应用程序的配置方式,找出了导致问题的原因。

不工作的配置

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

但是工作的配置有

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

显然,将 Context 的 docBase 设置为 "" 会导致此行为。更改 server.xml 以便 Context 的 docBase 具有路径最后一个子目录的名称,并将 Host 元素的 appBase 设置为从那里向上的一个目录解决了这个问题。