无法为JSP编译类:无法解析类型java.util.Map $ Entry。它是从所需的.class文件间接引用的

时间:2013-10-08 09:06:51

标签: java jsp tomcat servlets

我无法让tomcat7编译jsps。直到运行示例servlet就好了,服务启动并运行。我正在运行oracle java 8。

有人能指出我正确的方向吗?

这是stacktrace:

type Exception report

message Unable to compile class for JSP:

description The server encountered an internal error that prevented it from fulfilling this request.

exception

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

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

Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:331)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:468)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.35 logs.

代码看起来像这样,它是tomcat7的示例代码,所以我的猜测是正确的。

<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %>
<html>
<head>
  <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title>
</head>
<body>
<h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1>
<hr>
<p>This tag handler simply echos "Hello, World!"  It's an example of
a very basic SimpleTag handler with no body.</p>
<br>
<b><u>Result:</u></b>
<mytag:helloWorld/>
</body>
</html>

11 个答案:

答案 0 :(得分:93)

您必须使用支持JDK 8的更新版本的tomcat。

我可以确认apache-tomcat-7.0.35不支持JDK8,我也可以确认apache-tomcat-7.0.50是否支持JDK8。

答案 1 :(得分:13)

JDK8的类格式已经改变,这就是Tomcat无法编译JSP的原因。尝试获取更新版本的Tomcat。

我最近遇到了同样的问题。这是Tomcat中的一个错误,或者更确切地说,JDK 8的类文件格式与之前的JDK8版本略有不同。这会导致不一致,并且Tomcat无法在JDK8中编译JSP。

参见以下参考文献:

答案 2 :(得分:2)

因为我们在Ubuntu 12.04 LTS上运行,并且最新官方支持的tomcat7包是7.0.26,所以我们不能轻易更新整个tomcat。

为了测试jdk8,我能够通过更改一些罐子来解决这个问题,而不是最新的7.0。*版本。

我将jasper.jar,jasper-el和tomcat-util切换到版本7.0.53并添加了ecj-4.3.1.jar。这使应用程序重新上线。

但是我也用这个改变了打包内容,所以也许最好下载整个tomcat并将它自己安装为搞乱软件包。因此,请将此视为非常脏的快速解决方法或解决方法。

答案 3 :(得分:2)

如果您正在使用maven,那么您可以将tomcat7-maven-plugin添加到您的pom.xml中,它将运行正常。这个插件将在支持JDK 1.8的Tomcat servlet容器版本7.0.47上运行该项目。

    <plugins>
    <plugin>
     <groupId>org.apache.tomcat.maven</groupId>
     <artifactId>tomcat7-maven-plugin</artifactId>
     <version>2.2</version>
     <configuration>
<!-- Include context file for Datasource configuration -->
     <contextFile>./src/main/webapp/META-INF/context.xml</contextFile>
    <port>8080</port>
     </configuration>
     <dependencies>
<!-- Include jdbc driver dependency if using datasource (in my case oracle) -->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.4.0</version>
    </dependency>
  </dependencies>
    </plugin>
    </plugins>

希望这很有用! 感谢

答案 4 :(得分:0)

添加此导入<%@page import="java.util.Map" %>

这对我有用,但我还需要添加&lt;%@ page import =“java.util.HashMap”%&gt;。 似乎上面的答案是正确的,如果你有更新的tomcat,你可能不需要添加这些行,但由于我无法改变我的整个系统,这是有效的。
谢谢

答案 5 :(得分:0)

来自JIRA knowledge base

Symptoms
     

工作流程操作可能无法访问

     
      
  1. JIRA可能会在屏幕上抛出异常
  2.   
  3. 可能存在以下一种或两种情况:
  4.         

    以下内容出现在atlassian-jira.log中:

         2007-12-06 10:55:05,327 http-8080-Processor20 ERROR [500ErrorPage] 
         Exception caught in500 page Unable to compile class for JSP
        org.apache.jasper.JasperException: Unable to compile class for JSP
       at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:572)
       at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:305)
    
         

    _

    Cause:
    
         

    Tomcat容器缓存由。生成的.java和.class文件   它们由Web应用程序使用的JSP解析器。有时这些得到   已损坏或无法找到。修补程序或升级后可能会发生这种情况   包含对JSP的修改。

    Resolution
    
         

    1.如果使用独立的JIRA或/ work,如果使用EAR / WAR安装,请删除/ work文件夹的内容   。   2.验证运行JIRA应用程序进程的用户是否具有/ work目录的读/写权限。   3.重新启动JIRA应用程序容器以重建文件。

答案 6 :(得分:0)

在tomcat 7.0.19上将我的应用程序从java 6升级到java 8时面临完全相同的问题。 将tomcat升级到7.0.59后,此问题已解决。

答案 7 :(得分:0)

尝试将<%@page import="java.util.Map.Entry"%>添加到您的jsp文件

答案 8 :(得分:0)

有很多正确/相同的答案,但对于将来的参考:

同样代表Tomcat 7.请注意,仅更新已使用的框架版本(如其他类似问题中所提出的)是不够的。

您还必须更新Tomcat插件的版本。 使用Java 7对我有用的是升级到tomcat7-maven-plugin(= Tomcat 7.0.47)的2.2版。

答案 9 :(得分:0)

我最近遇到了同样的问题。我是使用IntelliJx64与Tomcat7.0.32和jdk.8.0.102 。那时没有问题。我能够直接访问我的部署 localhost:[port] ,而无需添加 [mywebapp] / ROOT

我尝试迁移到eclipse neon 时, 我遇到了当我尝试将路径设置为空字符串时讨论的相同错误 。当我对Java7强制执行环境并将模块设置为空时,它没有解决脚趾问题。但是,当我将我的tomcat安装更改为7.072并手动将上下文路径配置更改为path =“”时,问题在eclipse中得到了解决。 (您可以通过双击服务器操作路径并切换到模块选项卡。)

我很奇怪IntelliJ是如何解决与tomcat安装版本相关的相同错误的任何问题?

似乎与使用中的IDE有关系。

答案 10 :(得分:0)

我之前碰到过这个,正如其他人所说:只是upgrade jetty plugin

如果您使用maven

转到pom.xml中的jetty插件并将其更新为

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.3.0.v20150612</version>
    <configuration>
        <scanIntervalSeconds>3</scanIntervalSeconds>
        <httpConnector>
            <port>${jetty.port}</port>
            <idleTimeout>60000</idleTimeout>
        </httpConnector>
        <stopKey>foo</stopKey>
        <stopPort>${jetty.stop.port}</stopPort>
    </configuration>
</plugin>

希望这能帮到你