【发布时间】: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。现在挖掘它以找出它最后一次修改的位置。