2013-12-19 1 views
3

Я использую maven для управления зависимостью моего веб-проекта. Я добавляю зависимость apache poi в мой файл pom. он не показывает ошибку при выполнении. но когда он запустится, он выкинет RuntimeException в мой класс MainApplication(). в то время как это дает 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

Во-вторых, время компиляции! = Время выполнения. Просто из-за того, что банка была сосана maven и была доступна для компиляции, не означает, что она будет там, когда ваш код будет работать. Вам также необходимо обеспечить, чтобы вы упаковывали свои зависимости с помощью своего кода или иным образом гарантировали, что они находятся в пути к классам во время выполнения.

Вы, кажется, (из stacktrace) должны писать веб-приложение, поэтому вам нужно убедиться, что все ваши зависимости попадают в войну в /WEB-INF/lib/, чтобы они были во время выполнения.

И, наконец, POI 3.8 beta 3 - очень странная версия для использования. Вы должны либо пойти с последней стабильной (сейчас 3,9), либо с последней бета-версией (справа не 3.10 beta 2). См. POI homepage для получения информации о текущих выпусках.

+0

спасибо. Я исправил свою проблему. Я изменил область действия «предоставил» на «компиляцию», а затем, после того, как я установил чистую установку, в моем военном пакете существует файл poi jar, существующий в/WEB-INF/lib /. оно работает. – user3120272

Смежные вопросы