2013-09-20 2 views
2

Я генерирую исполняемую войну с tomcat7-maven-plugin:exec-war-only. Плагин конфигурация выглядит следующим образом:«Отрицательное время» при попытке запустить WAR с помощью tomcat7-maven-plugin: exec-war-only

<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".

+1

это дублируется из Является ли: http://stackoverflow.com/questions/8583853/negative-time-from-jsp-compiler? – porfiriopartida

+0

Исключением является то же самое, но причина не та. Эта проблема была связана со специальными символами в имени файла и была исправлена ​​в Tomcat 7.0.27. У меня нет специальных символов и есть Tomcat 7.0.37. – AlexZam

+0

Просто быстрый вопрос: бы вы случайно не жили в часовом поясе к востоку от UTC? – fvu

ответ

0

Не совсем уверен, почему возникла проблема, но выяснил решение. Ошибка возникает, поскольку один или несколько файлов, которые вы пытаетесь создать, имеет отрицательное время. (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; 
    } 
} 
Смежные вопросы