【问题标题】:"Negative time" when trying to run WAR generated with tomcat7-maven-plugin:exec-war-only尝试运行使用 tomcat7-maven-plugin:exec-war-only 生成的 WAR 时的“负时间”
【发布时间】: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"

【问题讨论】:

  • 它是否与:stackoverflow.com/questions/8583853/… 重复?
  • 异常相同但原因不同。该问题与文件名中的特殊字符有关,并在 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


【解决方案1】:

不太确定为什么会出现问题,但找到了解决方案。发生错误是因为您尝试构建的一个或多个文件的时间为负。 (file.getLastModified() 返回负值)。如果这是一个巨大的项目,可能很难跟踪其中哪些出错了。下面的代码可能会有所帮助:

package com.example;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ModifyAll {
    public static void main(String[] args) throws IOException {
        List<File> folderList = new ArrayList<>();
        List<File> fileList = new ArrayList<>();

        File folder = new File("D:/Rakhu/Copy/projectfolder/src");
        FileVO baseFileVO = segregateFiles(folder);
        fileList.addAll(baseFileVO.getFileList());
        folderList.addAll(baseFileVO.getFolderList());

        for (int i = 0; i < folderList.size(); i++) {
            FileVO thisVO = segregateFiles(folderList.get(i));
            fileList.addAll(thisVO.getFileList());
            folderList.addAll(thisVO.getFolderList());
        }

        for (int i = 0; i < fileList.size(); i++) {
            Date dte = new Date();
            long milliSeconds = dte.getTime();
            System.out.println("Setting Time For " + fileList.get(i) + " as " + milliSeconds);
            fileList.get(i).setLastModified(milliSeconds);
        }
        System.out.println("Succesfully Modified..!!!");
    }

    public static FileVO segregateFiles(File folder) {
        List<File> folderList = new ArrayList<>();
        List<File> fileList = new ArrayList<>();

        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                fileList.add(listOfFiles[i]);
            } else {
                folderList.add(listOfFiles[i]);
            }
            System.out.println(listOfFiles[i]);
        }
        return new FileVO(fileList, folderList);
    }
}



FileVO.java
package com.example;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileVO {
    List<File> fileList = new ArrayList<>();
    List<File> folderList = new ArrayList<>();

    public FileVO(List<File> fileList, List<File> folderList) {
        this.fileList = fileList;
        this.folderList = folderList;
    }

    public List<File> getFileList() {
        return fileList;
    }

    public void setFileList(List<File> fileList) {
        this.fileList = fileList;
    }

    public List<File> getFolderList() {
        return folderList;
    }

    public void setFolderList(List<File> folderList) {
        this.folderList = folderList;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多