Bug 1080026

Summary: JDK8 JasperException: Unable to compile class for JSP. java.util.Map$Entry cannot be resolved
Product: [JBoss] JBoss Enterprise Application Platform 6 Reporter: Emil Cervenan <ecervena>
Component: WebAssignee: Rémy Maucherat <rmaucher>
Status: CLOSED CURRENTRELEASE QA Contact: Radim Hatlapatka <rhatlapa>
Severity: high Docs Contact: Russell Dickenson <rdickens>
Priority: unspecified    
Version: 6.3.0CC: ecervena, jstefl, maschmid, mvelas, trepel
Target Milestone: ER10   
Target Release: EAP 6.3.0   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2014-08-04 10:13:30 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1104190, 1224883    
Attachments:
Description Flags
project build none

Description Emil Cervenan 2014-03-24 14:32:42 UTC
Description of problem:
Exception is thrown when accessing JSP page with java.util.HashMap reference. This issue is related to JDK 8. HashMap implementation has changed and looks like jasper works with HashMap$Entry subclass which is not pressent in JDK 8 HashMap anymore. 


Version-Release number of selected component (if applicable):
Java(TM) SE Runtime Environment (build 1.8.0-b132)
EAP 6.3.0.DR5

How reproducible:
Always

Steps to Reproduce:
1. Use java.util.HashMap in JSP file or reference it with some import
2. Build project with JDK 8
3. Deploy on EAP 6.3.0.DR5
4. Access JSP page

JSP example: (StatusReport.executedJobs is referenced HashMap)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="springtest.init.StatusReport,java.lang.Integer" %>
<html>
  <head><title>Scheduled Job Report Page</title></head>
  <body>

    Number of milliseconds from application webcontainer deployment:
    <ul><li>
        <% out.println(StatusReport.getMillsFromStart()); %>
    </li></ul>
    
    <table border="1">
        <thead>
            <tr><th>Job Name</th><th>Number of jobs executed</th></tr>
        </thead>
        <%
            for (String key : StatusReport.executedJobs.keySet()) {
                Integer value = (Integer)StatusReport.executedJobs.get(key);
        %>
            <tr>
                <td class="key" id="<%= key %>">
                    <%= key %>
                </td>
                <td class="value" id="<%= key %>-value">
                    <%= value %>
                </td>
            </tr>
        <%
            }
        %>
    </table>
  </body>
</html>

Status report class:

package springtest.init;

import java.util.HashMap;
import java.util.Map;
import java.util.Date;

public class StatusReport
{
   public static final Map<String, Integer> executedJobs = new HashMap<String, Integer>();
   public static final Date startDate = new Date();

   /**
    * This method os not thread safe. We assume that there will not be only more job
    * of the same name trying to update the count at the same time. 
    * @param jobName
    */
   public static void increaseJobCount(String jobName)
   {
      int cnt = 1;
      if (executedJobs.containsKey(jobName))
      {
         cnt += executedJobs.get(jobName);
      }
      executedJobs.put(jobName, cnt);
   }

   public static long getMillsFromStart()
   {
      return new Date().getTime() - startDate.getTime();
   }
}


Actual results:

15:12:22,893 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/quartz1-scheduling].[jsp]] (http-/127.0.0.1:8080-13) JBWEB000236: Servlet.service() for servlet jsp threw exception: org.apache.jasper.JasperException: JBWEB004062: Unable to compile class for JSP: 

JBWEB004061: An error occurred at line: 1 in the generated java file
The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files

JBWEB004211: Stacktrace:
	at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:69) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:451) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:361) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:339) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:326) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:606) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:308) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:309) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:242) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.4.0.Final-redhat-5.jar:7.4.0.Final-redhat-5]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:353) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:911) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at org.apache.tomcat.util.net.NioEndpoint$ChannelProcessor.run(NioEndpoint.java:920) [jbossweb-7.4.0.Beta4.jar:7.4.0.Beta4]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0]
	at java.lang.Thread.run(Thread.java:744) [rt.jar:1.8.0]

Comment 1 Emil Cervenan 2014-03-24 14:37:10 UTC
Created attachment 878086 [details]
project build

Comment 2 Emil Cervenan 2014-03-25 09:55:18 UTC
Workaround is to use latest ECJ module (ecj-4.3.1.jar) instead of ecj-3.7.2-redhat-1.jar.

Comment 3 Rémy Maucherat 2014-06-03 12:47:53 UTC
Java 8 JSP compilation will need 4.4 to work well, so updating doesn't really make sense.

Comment 4 Martin Velas 2014-08-04 10:13:30 UTC
This issue reported against older version, cannot be reproduced against latest 6.3.0.ER10 bits, which means it was fixed earlier. Therefore, we are closing this bug. Thank you for reporting this issue.