2012-11-01 15 views
1

我試圖在調用特定的servlet時使用JExcel Api將數據從數據庫導出到Excelsheet中,但是當啓動Tomcat時,我得到多個異常。這裏是由偏食給出的錯誤信息:當在webapp中使用JExcel Api時,Tomcat 7在啓動時崩潰

Nov 01, 2012 10:57:14 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[/web]] 
    at java.util.concurrent.FutureTask$Sync.innerGet(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:785) 
    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$Sync.innerRun(Unknown Source) 
    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[/web]] 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
... 7 more 
Caused by: java.lang.NoClassDefFoundError: jxl/write/WriteException 
    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) 
... 7 more 
Caused by: java.lang.ClassNotFoundException: jxl.write.WriteException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 
... 21 more 

Nov 01, 2012 10:57:14 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$Sync.innerGet(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$Sync.innerRun(Unknown Source) 
    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:785) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
... 7 more 

Nov 01, 2012 10:57:14 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代碼:

import java.io.IOException; 
import java.io.PrintWriter; 

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 jxl.write.WriteException; 


/** 
* Servlet implementation class Test 
*/ 
@WebServlet(description = "A simple test.", urlPatterns = { "/test" }) 

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

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public Test() { 
     super(); 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     try { 
      WriteExcel.writeTestFile(); 
     } catch (WriteException e) { 
      e.printStackTrace(); 
     } 

     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Test!</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("I've written an Excel file!"); 
     out.println("</body>"); 
     out.println("</html>"); 

    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request, response); 
    } 

} 

這裏是WriteExcel類的代碼:

import java.io.File; 
import java.io.IOException; 
import java.util.Locale; 

import jxl.CellView; 
import jxl.Workbook; 
import jxl.WorkbookSettings; 
import jxl.format.UnderlineStyle; 
import jxl.write.Formula; 
import jxl.write.Label; 
import jxl.write.Number; 
import jxl.write.WritableCellFormat; 
import jxl.write.WritableFont; 
import jxl.write.WritableSheet; 
import jxl.write.WritableWorkbook; 
import jxl.write.WriteException; 
import jxl.write.biff.RowsExceededException; 

//tomcat hat probleme mit der jxl library 
public class WriteExcel { 

    private WritableCellFormat timesBoldUnderline; 
    private WritableCellFormat times; 
    private String inputFile; 

public void setOutputFile(String inputFile) { 
    this.inputFile = inputFile; 
    } 

    public void write() throws IOException, WriteException { 
    File file = new File(inputFile); 
    WorkbookSettings wbSettings = new WorkbookSettings(); 

    wbSettings.setLocale(new Locale("en", "EN")); 

    WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings); 
    workbook.createSheet("Report", 0); 
    WritableSheet excelSheet = workbook.getSheet(0); 
    createLabel(excelSheet); 
    createContent(excelSheet); 

    workbook.write(); 
    workbook.close(); 
    } 

    private void createLabel(WritableSheet sheet) 
     throws WriteException { 
    // Lets create a times font 
    WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10); 
    // Define the cell format 
    times = new WritableCellFormat(times10pt); 
    // Lets automatically wrap the cells 
    times.setWrap(true); 

    // Create create a bold font with unterlines 
    WritableFont times10ptBoldUnderline = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD, false, 
     UnderlineStyle.SINGLE); 
    timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline); 
    // Lets automatically wrap the cells 
    timesBoldUnderline.setWrap(true); 

    CellView cv = new CellView(); 
    cv.setFormat(times); 
    cv.setFormat(timesBoldUnderline); 
    cv.setAutosize(true); 

    // Write a few headers 
    addCaption(sheet, 0, 0, "Header 1"); 
    addCaption(sheet, 1, 0, "This is another header"); 


    } 

    private void createContent(WritableSheet sheet) throws WriteException, 
     RowsExceededException { 
    // Write a few number 
    for (int i = 1; i < 10; i++) { 
     // First column 
     addNumber(sheet, 0, i, i + 10); 
     // Second column 
     addNumber(sheet, 1, i, i * i); 
    } 
    // Lets calculate the sum of it 
    StringBuffer buf = new StringBuffer(); 
    buf.append("SUM(A2:A10)"); 
    Formula f = new Formula(0, 10, buf.toString()); 
    sheet.addCell(f); 
    buf = new StringBuffer(); 
    buf.append("SUM(B2:B10)"); 
    f = new Formula(1, 10, buf.toString()); 
    sheet.addCell(f); 

    // Now a bit of text 
    for (int i = 12; i < 20; i++) { 
     // First column 
     addLabel(sheet, 0, i, "Boring text " + i); 
     // Second column 
     addLabel(sheet, 1, i, "Another text"); 
    } 
    } 

    private void addCaption(WritableSheet sheet, int column, int row, String s) 
     throws RowsExceededException, WriteException { 
    Label label; 
    label = new Label(column, row, s, timesBoldUnderline); 
    sheet.addCell(label); 
    } 

    private void addNumber(WritableSheet sheet, int column, int row, 
     Integer integer) throws WriteException, RowsExceededException { 
    Number number; 
    number = new Number(column, row, integer, times); 
    sheet.addCell(number); 
    } 

    private void addLabel(WritableSheet sheet, int column, int row, String s) 
     throws WriteException, RowsExceededException { 
    Label label; 
    label = new Label(column, row, s, times); 
    sheet.addCell(label); 
    } 


    public static void writeTestFile() throws WriteException, IOException { 
    WriteExcel test = new WriteExcel(); 
    test.setOutputFile("d:/test.xls"); 
    test.write(); 
    System.out.println("Please check the result file under d:/test.xls"); 
    } 

} 

的方法writeTestFile( )在WriteExcel類中工作正常時,在本地獨立項目中測試。
當方法writeTestFile()未被調用時,servlet本身也可以工作。

有人可以澄清爲什麼我得到例外嗎?
也有一個修復或解決方法?

+2

錯誤非常明顯:'由java.lang.NoClassDefFoundError引發:jxl/write/WriteException'。您需要將相關的jar添加到您的web應用程序/ tomcat。 – Augusto

+0

你在類路徑中添加了jxl-xxxx.jar嗎? – vels4j

+0

jar文件存在於項目和/ tomcatHome/lib文件夾中。 這就是爲什麼這讓我非常困惑。 – Strike

回答

4

試試這個:雙擊服務器,點擊「打開啓動配置」,進入Classpath選項卡,在User Entries下添加jar。