【问题标题】:Negative time from JSP compilerJSP 编译器的负时间
【发布时间】:2012-01-24 21:54:18
【问题描述】:

什么可能导致这样的错误? File.java 的 Javadoc 表示,如果传入负值,它将引发此异常。所以问题是,为什么 jasper 会传入一个负值。我查找了 jasper 资源,但没有找到与我正在运行的完全匹配的资源,行号也不完全匹配。根据 javadoc,我设置的版本从 File.lastModified 中设置了最后修改时间,它永远不会返回负值。

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Negative time
        at java.io.File.setLastModified(File.java:1258)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:376)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)

...

更新:我下载了 Tomcat 的源代码并通读了源代码。 Compile.java 中的相关代码是:

375   File javaFile = new File(ctxt.getServletJavaFileName());
376   Long jspLastModified = ctxt.getLastModified(ctxt.getJspFile());
377   javaFile.setLastModified(jspLastModified.longValue());

ctxt 是一个 JspCompilationContext,如果有任何错误,它会默认返回 -1,并且 File 从否定参数中抛出 IllegalArgumentException。我仍然不知道为什么会出现错误,至少我知道 IllegalArgumentException 来自哪里。

【问题讨论】:

  • 什么 Tomcat 版本?什么平台制造/版本/架构?什么 JDK 品牌/版本?
  • Tomcat 7,JDK 6,平台是 Redhat 5
  • 请在版本中更具体。目前有 23 个不同的 Tomcat 7 版本,例如,最新的是 7.0.23。
  • TC 7.0.23,JDK 1.6.0-29 64bit
  • 下载了 7.0.23 的源代码,我有 jasper Compiler.java。现在挖掘它以找出它最后一次修改的位置。

标签: jsp tomcat tomcat7


【解决方案1】:

我遇到了同样的问题。 maven有一个bug。他们期望路径的值应该以“/”开头。 我的初始 Maven 配置:

<plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
       <configuration>
            <path>TimeToBookUber</path>
       </configuration>
</plugin>

我在路径前面加了'/',修改后是这样的:

<plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
       <configuration>
            <path>/TimeToBookUber</path>
       </configuration>
</plugin>

【讨论】:

    【解决方案2】:

    如果文件或包含的文件夹包含算术字符,则会出现错误。错误has since been fixed as of 7.0.27.

    我实际上正在运行 7.0.32,但仍然遇到此问题,但由于我注意到它存在算术字符问题,所以我想测试一个理论。果然,我的问题的原因是因为包含的文件夹名称包含一个空格字符。我删除了文件夹名称中的空格,它工作正常。到目前为止,我还没有深入了解是否有关于该空间的新错误报告,但如果没有,我会检查并提交一个新错误。

    【讨论】:

      【解决方案3】:

      当我从 IntelliJ Idea 部署应用程序时,我在 7.0.27 中遇到了同样的问题,在应用程序上下文中带有斜杠 - 删除它对我有用

      【讨论】:

      • 在 Intellij 2016.1 中遇到了同样的问题。在 Tomcat 配置中删除应用程序上下文中的尾部斜杠后,它再次工作。谢谢。
      【解决方案4】:

      当我的 WAR 文件的名称中有空格和句点时,我收到了这个错误。删除它们解决了这个问题。

      【讨论】:

      • 即使 WAR 文件有连字符“-”也会出现问题
      【解决方案5】:

      看起来像 Tomcat 中的错误。尝试 Tomcat 7.0.16,其中它没有明确设置生成的 Java 文件的最后修改。在那个版本之后它被改变了。如果它适用于 7.0.16,我会向 Tomcat 人员report 提供有关该平台的尽可能详细信息(Redhat 5 信息不足)。

      【讨论】:

        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2016-11-03
        • 1970-01-01
        • 2015-02-11
        • 2010-10-16
        • 2021-08-02
        相关资源
        最近更新 更多