【发布时间】:2013-09-20 21:00:18
【问题描述】:
我用tomcat7-maven-plugin:exec-war-only 生成可执行的war。插件配置如下:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<warFile>${project.build.outputDirectory}/${project.build.finalName}.war</warFile>
<mode>both</mode>
<enableNaming>true</enableNaming>
</configuration>
<executions>
<execution>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
然后tomcat7:run-war 部署应用程序并且运行良好。
如果我运行mvn package,则会创建应用程序 jar。如果我然后运行java -jar app.jar,它将成功部署到 Tomcat 7.0.37。但是它不能编译任何JSP。
它说:
2013-09-21 00:38:05 JstlView [DEBUG] Forwarding to resource [/jsp/login.jsp] in InternalResourceView 'login'
Sep 21, 2013 12:38:05 AM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Sep 21, 2013 12:38:05 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Negative time
at java.io.File.setLastModified(Unknown Source)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:376)
如您所见,JSP 名称中没有空格或特殊字符。我还尝试将 app.jar 放在驱动器的根目录中,以排除文件夹名称中任何可能的字符。效果是一样的。
UPD。我使用远程调试来查看会发生什么。而Long jspLastModified = ctxt.getLastModified(ctxt.getJspFile()); 行返回-1。其中ctxt.getJspFile() 返回"/jsp/login.jsp"。
【问题讨论】:
-
异常相同但原因不同。该问题与文件名中的特殊字符有关,并在 Tomcat 7.0.27 中得到修复。我没有特殊字符并且有 Tomcat 7.0.37。
-
问一个简单的问题:您是否会生活在 UTC 以东的时区?
-
是的,我在 UTC+4。为什么重要?
-
基本原理:想知道您的问题是否相关this JDK enhancement request:如果部署的 JSP 文件由于某种原因具有对应于负 wrt 纪元的时间戳(因此,请查看已部署文件的时间戳) 你可能会得到这个错误。只需在受影响的 JSP 上执行
File.getLastModified()并查看它返回的内容。
标签: java jsp tomcat7 maven-tomcat-plugin