2013-12-19 149 views
3

我使用maven來管理我的web項目依賴項。我將apache poi依賴項添加到我的pom文件中。它在編譯時不顯示錯誤。但是當它運行時,它會在我的MainApplication()類中拋出RuntimeException。雖然它給出java.lang.NoClassDefFoundError:org/apache/poi/ss/usermodel/Workbookjava.lang.NoClassDefFoundError:org/apache/poi/ss/usermodel/Workbook

我有一個MainApplication類。

public class MainApplication extends Application { 
private Set<Class<?>> classes = new HashSet<Class<?>>(); 
HashSet<Object> singletons = new HashSet<Object>(); 

public MainApplication() { 
    try { 
     ClassPathXmlApplicationContext springContext = new ClassPathXmlApplicationContext("applicationContext.xml"); 

     singletons.add(springContext.getBean("transformService", DataTransformService.class)); 
} 

public Set<Class<?>> getClasses() { 
    return classes; 
} 

protected ApplicationContext springContext; 

public Set<Object> getSingletons() { 
    return singletons; 
} 

}

下面是我添加

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.8-beta3</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>commons-logging</groupId> 
    <artifactId>commons-logging</artifactId> 
    <version>1.1.1</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>commons-codec</groupId> 
    <artifactId>commons-codec</artifactId> 
    <version>1.2</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.14</version> 
    <scope>provided</scope> 
</dependency> 


ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/reportv2]] StandardWrapper.Throwable: java.lang.RuntimeException: Failed to construct public com.osg.application.MainApplication() 
at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:144) [:] 
at org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:243) [:] 
at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:191) [:] 
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:67) [:] 
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36) [:] 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1208) [:6.0.0.Final] 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:955) [:6.0.0.Final] 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188) [:6.0.0.Final] 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [:6.0.0.Final] 
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.0.0.Final] 
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final] 
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final] 
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.0.0.Final] 
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.0.0.Final] 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [:6.0.0.Final] 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.0.0.Final] 
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.0.0.Final] 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.0.0.Final] 
at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.0.0.Final] 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.0.0.Final] 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.0.0.Final] 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.0.0.Final] 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.0.0.Final] 
at java.lang.Thread.run(Thread.java:695) [:1.6.0_65] 
Caused by: java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook 
at java.lang.Class.getDeclaredConstructors0(Native Method) [:1.6.0_65] 
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2446) [:1.6.0_65] 
at java.lang.Class.getDeclaredConstructors(Class.java:1872) [:1.6.0_65] 
at  org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:227) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:930) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:903) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) [:3.0.5.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) [:3.0.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) [:3.0.5.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) [:3.0.5.RELEASE] 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) [:3.0.5.RELEASE] 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) [:3.0.5.RELEASE] 
at com.osg.application.MainApplication.<init>(MainApplication.java:19) [:] 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [:1.6.0_65] 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [:1.6.0_65] 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [:1.6.0_65] 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [:1.6.0_65] 
at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:132) [:] 
... 23 more 

回答

7

Apache POI provides a components page其中詳細闡述了所有項目的不同部分,什麼罐子你需要和你所需要的Maven構件。如果你看看這裏,您會看到以下內容:

|Component | Application type | Maven artifactId | Notes 
|Common SS | Excel XLS and XLSX | poi-ooxml | WorkbookFactory and friends all require poi-ooxml, not just core poi | 

由於是明確規定,如果你想使用所有常見org.apache.poi.ss類的,你需要依賴於poi-ooxml,而不僅僅是poi

其次,編譯時間!=運行時間。只是因爲一個jar被maven吸引並且可以與之編譯,並不意味着它會在你的代碼運行時出現在那裏。你還需要確保你用代碼打包你的依賴關係,或者確保它們在運行時在類路徑中。

你似乎(從堆棧跟蹤)編寫一個Web應用程序,所以你需要確保你所有的依賴被放入戰爭/WEB-INF/lib/,所以他們在運行時在那裏。

最後,POI 3.8 beta 3是一個非常奇怪的版本使用。你應該選擇最新的穩定版本(現在3.9版本)或者最新的beta版本(右側版本不是3.10 beta 2版本)。有關當前版本的詳細信息,請參見POI homepage

+0

非常感謝。我解決了我的問題。我將範圍從'provided'更改爲'compile',然後在maven clean install之後,在我的war包中,/ WEB-INF/lib /中存在poi jar。有用。 – user3120272