无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的
Posted
技术标签:
【中文标题】无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的【英文标题】:Unable to compile class for JSP: The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files 【发布时间】:2013-10-15 03:00:44 【问题描述】:我无法让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>
【问题讨论】:
jsp页面出错,tomcat无法编译 你能发布你的jsp文件吗? mabbas 是正确的,你需要在你的jsp文件中添加这一行。<%@page import="java.util.Map.Entry"%>
JDK8的类格式改变了,这就是Tomcat无法编译JSP的原因。尝试获取更新版本的 Tomcat。请参阅下面的答案。
这适用于所有带有嵌入式编译器in general的应用程序。
【参考方案1】:
添加此导入<%@page import="java.util.Map" %>
这对我有用,但我还需要添加 。 上面的答案似乎是正确的,如果你有较新的 tomcat,你可能不需要添加这些行,但由于我无法更改我的整个系统,所以这行得通。 谢谢
【讨论】:
【参考方案2】:来自JIRA knowledge base:
Symptoms
工作流操作可能无法访问
JIRA 可能会在屏幕上抛出异常 可能存在以下一种或两种情况:
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 容器缓存由 Tomcat 生成的 .java 和 .class 文件 Web 应用程序使用它们的 JSP 解析器。有时这些得到 损坏或找不到。这可能在补丁或升级后发生 包含对 JSP 的修改。
Resolution
1.如果使用独立 JIRA,则删除 /work 文件夹的内容,如果使用 EAR/WAR 安装,则删除 /work . 2. 验证运行 JIRA 应用程序进程的用户对 /work 目录具有读/写权限。 3. 重启JIRA应用容器来重建文件。
【讨论】:
【参考方案3】:JDK8的类格式发生了变化,这就是Tomcat无法编译JSP的原因。尝试获取更新版本的 Tomcat。
我最近遇到了同样的问题。这是 Tomcat 中的一个错误,或者更确切地说,JDK 8 的类文件格式与之前的 JDK8 版本略有不同。这会导致不一致,Tomcat 无法在 JDK8 中编译 JSP。
请参阅以下参考资料:
Compiling JSPs with JDK 1.8 in Tomcat 8 compilation succeeds in java7 but fails in java8【讨论】:
【参考方案4】:您必须使用支持 JDK 8 的更新版本的 tomcat。
我可以确认 apache-tomcat-7.0.35 不支持 JDK8,我也可以确认 apache-tomcat-7.0.50 支持 JDK8。
【讨论】:
我在使用 Java 8 的 Tomcat 7.0.54 时也得到了这个结果。原来我在 lib 文件夹(来自较旧的安装)中有一个旧的 ecj-3.7.1.jar(编译器 tomcat 使用)。删除该 .jar 文件为我解决了这个问题(tomcat 使用 ecj-P20140317-1600.jar 代替)。所以请确保你有一个干净的 TC 安装! 它对我有用。谢谢你。在此处下载 Tomcat olex.openlogic.com/packages/tomcat/7.0.50。 感谢@AtliB! Tomcat 7.55 也有同样的问题。实际上问题是由于 lib 文件夹中存在旧的 ecj-3.7.2.jar(在导入其他库时导入)。删除它解决了问题:) 遗憾的是,Tomcat 文档对所有版本的 Tomcat 都说“Java X 或更高版本”,而实际上,可以使用的 Java 版本范围有限使用特定的 Tomcat 版本。 对我有用的是将 tomcat7-maven-plugin 的版本从 2.0 更改为 2.2【参考方案5】:因为我们在 Ubuntu 12.04 LTS 上运行,并且官方支持的最新 tomcat7 包是 7.0.26,所以我们无法轻松更新整个 tomcat。
我订购了 jdk8 进行测试,我能够通过针对最新的 7.0.* 版本更改一些 jar 来解决此问题。
我将 jasper.jar、jasper-el 和 tomcat-util 切换到 7.0.53 版本并添加了 ecj-4.3.1.jar。这会使应用程序重新联机。
但是...我也用这个更改了打包的内容,所以也许最好下载整个 tomcat 并将它自己安装用作混乱的包。因此,请仅将其视为非常肮脏的快速破解或解决方法。
【讨论】:
感谢 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/… 上找到了适合我的版本【参考方案6】:在 tomcat 7.0.19 上将我的应用程序从 java 6 升级到 java 8 时遇到了完全相同的问题。 将tomcat升级到7.0.59后,这个问题就解决了。
【讨论】:
【参考方案7】:尝试将<%@page import="java.util.Map.Entry"%>
添加到您的 jsp 文件中
【讨论】:
【参考方案8】:有很多正确/相同的答案,但供将来参考:
同样代表 Tomcat 7。请注意,仅更新您使用的框架的版本(如其他类似问题中所建议的那样)是不够的。
您还必须更新 Tomcat 插件的版本。 使用 Java 7 对我有用的是升级到 2.2 版的 tomcat7-maven-plugin (= Tomcat 7.0.47)。
【讨论】:
【参考方案9】:我最近遇到了同样的问题。我使用 IntelliJx64 和 Tomcat7.0.32 和 jdk.8.0.102。那时没有问题。我能够直接访问我的部署 localhost:[port] 而无需添加 [mywebapp] 或 /ROOT。
当我尝试迁移到 Eclipse neon 时,我遇到了与尝试将路径设置为空字符串时讨论的相同的错误强>。当我将执行环境强制为 Java7 并将模块设置为空时,它并没有解决脚趾问题。但是,当我将我的 tomcat 安装更改为 7.072 并手动将上下文路径配置更改为 path="" 时,问题在 eclipse 中得到了解决。 (您也可以通过双击服务器并切换到模块选项卡来操作路径。)
我想知道 IntelliJ 怎么没有给出与应该与 tomcat 安装版本相关的相同错误的任何问题?
似乎也与正在使用的 IDE 有关系。
【讨论】:
【参考方案10】:如果您使用的是 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>
希望这是有用的! 谢谢
【讨论】:
【参考方案11】:我之前遇到过这个,正如其他人所说:只是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>
希望对你有帮助
【讨论】:
以上是关于无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的的主要内容,如果未能解决你的问题,请参考以下文章
解决jsp里面写java代码 HTTP 状态 500 - 无法为 JSP 编译类 System.out cannot be resolved to a type