一尘不染

即时导入JSP编译失败

jsp

我们使用Apache / Tomcat /
Jasper和jboss安装了大型Web应用程序。在开发环境中,JSP是即时编译的。不幸的是,特别是有一个软件包似乎无法导入即时编译。对于某些类,使用完全限定的引用而不是导入是可行的,但并非对所有类都有效。所有有问题的类都放在一个jar中(nonEjb.jar)。预编译JSP可以很好地工作,但是每次我们需要更改一个受影响的文件时,这样做都非常痛苦。这个问题已经存在了很长一段时间,我真的想解决这个问题,因为我准备在受灾地区做一些工作。

这是一个小的测试页。第一次导入失败。导入的两个类非常相似,唯一的区别是它们的包装位置。(是的,我已经验证了两个类的包声明都是正确的。)

<%@ page contentType="text/html; charset=utf-8" %>
<%@ page errorPage="/error.jsp" %>

<%@ page import="com.elementk.lms.product.otr.OtrProviderType" %>
<%@ page import="com.elementk.lms.product.course.CourseType" %>

<html>
<body>
<hr>
Displaying the page...
<br>
<%= OtrProviderType.B24x7_PROVIDER.getId() %> value
<br>
<%= CourseType.SELF_STUDY.getId() %> value
</hr>
</body>
<html>

结果:

09 Mar 2010 21:29:40,555 ERROR [K] [RequestTimingFilter.doFilter:65] Unable to compile class for JSP:

An error occurred at line: 6 in the generated java file
The import com.elementk.lms.product.otr cannot be resolved

如果删除导入并完全限定引用(如com.elementk.lms.product.org.OtrProviderType),则会出现相同的错误。

是什么导致JSP编译器定位其中一个类而不是另一个?


阅读 245

收藏
2020-06-10

共1个答案

一尘不染

我们最终确定了为什么会这样。显然,动态编译器无法区分大小写,并且包com.elementk.lms.product包含一个名为Otr的类。编译器无法区分软件包“
com.elementk.lms.product.otr”和类“
com.elementk.lms.product.Otr”之间的区别。这解释了为什么即使原始导入为“
com.elementk.lms.product.otr.OtrProviderType”,错误消息也仅引用“
com.elementk.lms.product.otr”。

我们必须通过基本上避免问题的方式进行修复:我们将包重命名。

2020-06-10