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


67

我无法获取tomcat7来编译jsps。直到运行示例servlet一切正常,并且服务已启动并正在运行。我正在运行oracle java 8。

谁能指出我正确的方向?

这是堆栈跟踪:

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>

2
您在jsp页面中有一个错误,因此tomcat无法编译
SpringLearner 2013年

1
您可以发布您的jsp文件吗?mabbas是正确的,您需要在jsp文件中添加此行。<%@page import="java.util.Map.Entry"%>
Vinoth Krishnan

1
JDK8的类格式已更改,这就是Tomcat无法编译JSP的原因。尝试获取更高版本的Tomcat。请参阅下面的答案。
强麦

通常,这适用于所有具有嵌入式编译器的应用程序。
Holger

Answers:


96

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

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


23
我将Tomcat 7.0.54与Java 8结合使用,即使在那时也得到了。原来,我的lib文件夹中有一个旧的ecj-3.7.1.jar(tomcat使用的编译器)(来自较旧的安装)。删除该.jar文件为我解决了此问题(tomcat使用ecj-P20140317-1600.jar代替)。因此,请确保您具有干净的TC安装!
AtliB 2014年

1
它为我工作。谢谢。在此处olex.openlogic.com/packages/tomcat/7.0.50下载Tomcat 。
Sanjay Bhimani 2014年

3
感谢@AtliB!Tomcat 7.55也有同样的问题。实际问题是由于lib文件夹中存在旧ecj-3.7.2.jar(在导入其他lib时导入)。删除它解决了问题:)
Cedric Simon

3
实际上,对于所有版本的Tomcat ,Tomcat文档都说“ Java X或更高版本”是可耻的,实际上,适用于特定Tomcat版本的Java版本范围有限。
Burhan Ali 2014年

对我有用的是将tomcat7-maven-plugin的版本从2.0更改为2.2
Jayz 2015年


2

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

我打算用jdk8进行测试,我可以通过将一些jar更改为最新的7.0。*版本来解决此问题。

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

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


感谢您提供ECJ指针。如果有人正在寻找ECJ罐子,可以在mvnrepository.com/artifact/org.eclipse.jdt.core.compiler/ecj中找到它们。并非所有版本都适用于您的tomcat。我在jasper pom文件repo2.maven.org/maven2/org/apache/tomcat/tomcat-jasper/7.0.52/
djjeck

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>

希望这是有用的!谢谢


0

来自JIRA知识库

Symptoms

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

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

以下内容出现在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容器缓存由Web应用程序使用的JSP解析器生成的.java和.class文件。有时,这些文件已损坏或找不到。在包含对JSP的修改的补丁程序或升级之后,可能会发生这种情况。

Resolution

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


0

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

这对我有用,但是我还需要添加<%@ page import =“ java.util.HashMap”%>。似乎上述答案是正确的,如果您有更新的tomcat,则可能不需要添加这些行,但是由于我无法更改整个系统,因此可以正常工作。
谢谢


0

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



0

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

Tomcat 7也是如此。请注意,仅更新您使用的框架的版本(如在其他类似问题中所建议的)是不够的。

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


0

我最近遇到了同样的问题。我正在将IntelliJx64与Tomcat7.0.32和jdk.8.0.102一起使用。那时没有问题。我无需添加[mywebapp]/ ROOT就可以直接访问我的部署localhost:[port]

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

我想知道为什么IntelliJ不会给与应该与tomcat安装版本有关的同一错误带来任何问题?

似乎与正在使用的IDE也有关系。


0

正如其他人所说,我之前曾遇到过这个问题: upgrade jetty plugin

如果您正在使用 maven

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

<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>

希望这对你有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.