我们有一个大型 Web 应用程序安装,使用 Apache/Tomcat/Jasper 和 jboss。在开发环境中,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>
Result:
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 编译器找到其中一个类而不是另一个类?
我们终于确定了为什么会发生这种情况。显然,即时编译器不区分大小写,并且包 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”。
我们必须通过本质上避免问题来进行修复:我们重命名了包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)