2014-10-01 65 views
2

我正在使用Java Servlet進行項目工作。我正在使用eclipse junotomcat 7.0爲我的項目。我已經編寫了下面的servlet用於在本地服務器位置保存上傳的文件。但直到我將這個servlet添加到我的項目文件夾時,tomcat服務器才啓動。添加特定servlet時Tomcat服務器未啓動

package testPackage; 

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 


public class uploadFile extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    private static final String DATA_DIRECTORY = "data"; 
    private static final int MAX_MEMORY_SIZE = 1024 * 1024 * 2; 
    private static final int MAX_REQUEST_SIZE = 1024 * 1024; 


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

     if (!isMultipart) { 
      return; 
     } 

     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     factory.setSizeThreshold(MAX_MEMORY_SIZE); 
     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     String uploadFolder = getServletContext().getRealPath("") 
      + File.separator + DATA_DIRECTORY; 

     ServletFileUpload upload = new ServletFileUpload(factory); //###### ERROR ###### 

     upload.setSizeMax(MAX_REQUEST_SIZE); 

     try { 
      List items = upload.parseRequest(request); 
      Iterator iter = items.iterator(); 
      while (iter.hasNext()) { 
       FileItem item = (FileItem) iter.next(); 

       if (!item.isFormField()) { 
        String fileName = new File(item.getName()).getName(); 
        String filePath = uploadFolder + File.separator + fileName; 
        File uploadedFile = new File(filePath); 
        item.write(uploadedFile); 
       } 
     } 

     getServletContext().getRequestDispatcher("http://localhost/test-app/done.html").forward(
       request, response); 

     } catch (FileUploadException ex) { 
      throw new ServletException(ex); 
     } catch (Exception ex) { 
      throw new ServletException(ex); 
     } 
    } 
} 

的web.xml如下

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 

<servlet> 
    <servlet-name>FileUploading</servlet-name> 
    <servlet-class>testPackage.uploadFile</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>FileUploading</servlet-name> 
    <url-pattern>/upload</url-pattern> 
</servlet-mapping> 

</web-app> 

我已經加入所需的jar文件(公共的集合,公地文件上傳,公共-10,共享記錄)到構建路徑以及在WEB- INF/lib文件夾。我已經從apache的自己的網站下載了這些jar。所以,我認爲,這個罐子沒有任何問題。

啓動服務器時出現以下錯誤。

Oct 02, 2014 1:40:40 AM org.apache.catalina.core.AprLifecycleListener init 
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_20\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMD APP\bin\x86;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\GTK2-Runtime\lib;C:\Program Files (x86)\Bitvise SSH Client;D:\Extra Installation\Software\Matlab\runtime\win64;D:\Extra Installation\Software\Matlab\bin;C:\Program Files\MiKTeX 2.9\miktex\bin\x64\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;. 
Oct 02, 2014 1:40:41 AM org.apache.tomcat.util.digester.SetPropertiesRule begin 
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:test-app' did not find a matching property. 
Oct 02, 2014 1:40:41 AM org.apache.tomcat.util.digester.SetPropertiesRule begin 
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:servletBasic' did not find a matching property. 
Oct 02, 2014 1:40:41 AM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-bio-80"] 
Oct 02, 2014 1:40:41 AM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["ajp-bio-8009"] 
Oct 02, 2014 1:40:41 AM org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 1893 ms 
Oct 02, 2014 1:40:41 AM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Catalina 
Oct 02, 2014 1:40:41 AM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.34 
Oct 02, 2014 1:40:44 AM org.apache.catalina.util.SessionIdGenerator createSecureRandom 
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [335] milliseconds. 
Oct 02, 2014 1:40:47 AM org.apache.catalina.core.ContainerBase startInternal 
SEVERE: A child container failed during start 
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/test-app]] 
    at java.util.concurrent.FutureTask.report(Unknown Source) 
    at java.util.concurrent.FutureTask.get(Unknown Source) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.apache.catalina.LifecycleException: Failed to start component[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/test-app]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    ... 6 more 

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException 
    at java.lang.Class.getDeclaredFields0(Native Method) 
    at java.lang.Class.privateGetDeclaredFields(Unknown Source) 
    at java.lang.Class.getDeclaredFields(Unknown Source) 
    at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:87) 
    at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:261) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:140) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:67) 
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405) 
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 6 more 

Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileUploadException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 
    ... 20 more 

Oct 02, 2014 1:40:47 AM org.apache.catalina.core.ContainerBase startInternal 
SEVERE: A child container failed during start 
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 
    at java.util.concurrent.FutureTask.report(Unknown Source) 
    at java.util.concurrent.FutureTask.get(Unknown Source) 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) 
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:684) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:451) 


Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.apache.catalina.LifecycleException: A child container failed during start 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) 
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 6 more 

Oct 02, 2014 1:40:47 AM org.apache.catalina.startup.Catalina start 
SEVERE: Catalina.start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:684) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:451) 
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 7 more 
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 9 more 
Caused by: org.apache.catalina.LifecycleException: A child container failed during start 
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) 
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 11 more 

在同一個項目文件夾中還有一些其他的servlet。當我刪除上述的servlet時,tomcat服務器正常啓動。即使當我在源代碼中刪除標記爲### ERROR ###的行時,服務器也正常啓動。

我在這個領域很新,並盡我所能地解決這個問題。但現在我完全無能爲力。請幫忙..

+1

的tomcat仍無法看到的依賴。將公用罐放在/lib文件夾中 – kolossus 2014-10-01 20:38:16

+0

工作正常。 :)。非常感謝@kolossus。 – user2399614 2014-10-01 20:55:33

+0

固體;我會發佈一個答案 – kolossus 2014-10-01 20:57:00

回答

0

顯然,tomcat仍然無法加載與WAR一起打包的commons fileupload dependency。

大多數容器和應用程序服務器最安全的選擇是將依賴項放置在共享的lib文件夾(每個主要的JavaEE兼容應用程序服務器都有一個)。從這個中心位置,大多數應用服務器可以加載任何依賴關係。但是,您應該注意,放置在該文件夾中的罐子將被裝載到容器內的所有應用程序中;你不應該捆綁任何應用程序相同的罐子在該實例

相關