无法为 JSP 编译 class

Unable to compile the class for JSP

当我单击“查看”按钮查看用户详细信息时,我们遇到以下异常:

2017-06-30 19:23:52,831 ERROR [com.myapp.jsp] - <Unable to compile class for JSP: 

An error occurred at line: 53 in the jsp file: /WEB-INF/jsps/ViewUserDetails.jsp
apache cannot be resolved or is not a field
50:                     </myapphtml:myappRow>
51:                                         
52:                     <myapphtml:myappRow align="left" label="userdetails.field.label.orgs">
53:                         <logic:iterate name="userDetails" property="Orgs" id="org">         
54:                             &nbsp;<bean:write name="org" property="name" /><br>
55:                         </logic:iterate>
56:                     </myapphtml:myappRow>


Stacktrace:>
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 53 in the jsp file: /WEB-INF/jsps/ViewUserDetails.jsp
apache cannot be resolved or is not a field
50:                     </myapphtml:myappRow>
51:                                         
52:                     <myapphtml:myappRow align="left" label="userdetails.field.label.orgs">
53:                         <logic:iterate name="userDetails" property="mappedOrgs" id="org">           
54:                             &nbsp;<bean:write name="org" property="name" /><br>
55:                         </logic:iterate>
56:                     </myapphtml:myappRow>


Stacktrace:
    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:366)
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:490)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:379)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:341)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:662)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:364)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:743)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337)
    at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063)
    at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263)
    at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:386)
    at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at at com.myapp.tools.auth.client.AuthFilter.doFilter(AuthFilter.java:512)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.myapp.tools.auth.client.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

这仅发生在 RHEL 7.x 和 Tomcat 组合中。 除了这个之外,我无法重现这个问题。

附上 ViewUserDetails.jsp

<%@ page import="org.apache.struts.Globals" %>
<%@ page import="com.myapp.tools.api.impl.User" %>

<%@ include file="include/commonDef.jspf" %>

<tiles:insert definition="myapp.csd.office.layout.default">

    <tiles:put name="header" type="String">
        <myapphtml:myappPageHeaderTab headerImage="images/default/icn_user.gif" headerText="form.page.title.user_details"/>
    </tiles:put>

    <tiles:put name="content" type="String">
        <myapphtml:myappBlock>
            <myapphtml:myappMessage
                    genErrorKey="<%= myappGlobals.GENERAL_ERROR %>"
                    valErrorKey="<%= Globals.ERROR_KEY %>"
                    genErrorHeading="MC.General.genError"
                    valErrorHeading="MC.General.genError"
                    headingBundle="myappBASETAG"/>
        </myapphtml:myappBlock>

        <strutshtml:form action="/processUserList.do" method="POST">
            <input type="hidden" name="action" value="" />



                    <myapphtml:myappRow align="left" label="userdetails.field.label.orgs">
                        <logic:iterate name="userDetails" property="Orgs" id="org">         
                            &nbsp;<bean:write name="org" property="name" /><br>
                        </logic:iterate>
                    </myapphtml:myappRow>



            <myapphtml:myappButtonRow formname="UserDetailsForm">
                <myapphtml:myappButton action="cancel" name="form.button.label.cancel" buttonStyle="button_gt" />           
            </myapphtml:myappButtonRow>         
        </strutshtml:form>

    </tiles:put>

</tiles:insert>

尝试查看是否有一个名为 org 的字符串,将其更改为其他名称如 org1

参见 answer

String org = ""; something like this in jsp somewhere on the top of that package statement. Change that variable name to org1 or some other meaningful one and your problem will be solved.

Tomcat 中有一个 known issue,其编译器将其解释为对对象 org

字段 apache 的引用

The code works in TC4 because the generated code is much simpler - it ignores a number of possible error conditions. The fix for these issues in TC5 and TC6 includes a fully qualified reference to org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode()

The complier is interpreting this as a reference to the field apache of object org.

When you have generated code, there is always going to be the possibility of a naming clash. I can't see an easy way around this.

I am going to mark this as WONTFIX. More generally, avoiding the use of widely used package prefixes (org, com, etc) as variable names will reduce your risk of hitting this issue.

As an aside, a quick Google suggests you might also want to avoid 2 letter variable names that clash with top level domains.

请注意 RHEL 使用特定的 tomcat 版本,而不是社区版本。

Any community releases of Tomcat are not supported

The supported releases of Tomcat are included in our products:

Tomcat rpm package included in RHEL 7.1, which is based on Tomcat 7.0.54.

Please note that we backport critical bug and security fixes on the above versions when issues are raised or CVEs are reported. Therefore, the versions we provide are not exactly the same as community versions of Tomcat.