68

我无法让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>
4

11 回答 11

96

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

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

于 2014-01-24T01:10:41.397 回答
13

JDK8 的类格式发生了变化,这就是 Tomcat 无法编译 JSP 的原因。尝试获取更新版本的 Tomcat。

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

请参阅以下参考资料:

于 2013-11-12T18:31:40.100 回答
3

如果您使用的是 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>

希望这是有用的!谢谢

于 2017-03-16T16:04:01.673 回答
2

因为我们在 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并将它自己安装为搞乱包。因此,请仅将其视为非常肮脏的快速破解或解决方法。

于 2014-03-31T11:10:30.933 回答
1

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

于 2015-02-11T12:28:29.657 回答
1

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

于 2016-01-04T16:37:00.343 回答
1

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

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

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

于 2016-05-01T00:59:36.377 回答
1

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

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

我想知道为什么 IntelliJ 没有给出与 tomcat 安装版本相关的相同错误的任何问题?

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

于 2016-11-01T08:41:23.683 回答
1

正如其他人所说,我之前遇到过这个:只是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>

希望这对你有帮助

于 2017-10-08T08:36:45.497 回答
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 应用程序容器以重建文件。

于 2013-10-08T11:16:38.363 回答
0

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

这对我有用,但我还需要添加 <%@ page import="java.util.HashMap" %>。上面的答案似乎是正确的,如果你有较新的 tomcat,你可能不需要添加这些行,但由于我无法更改我的整个系统,所以这行得通。
谢谢

于 2013-10-08T09:35:16.013 回答