我一直在閱讀關於從包含在jar文件中的項目導入bean的問題,如this。但是我的項目(我們稱之爲Project A)只是一個在WEB-INF文件夾中的mvc-config.xml,而在src/main/resources/spring文件夾中的application-config.xml(都來自Spring Web Maven模板)。從罐子導入彈簧豆
我在註釋中定義了bean,服務和存儲庫,在這些類中,直到現在,我不需要任何其他配置,比如在mvc-config.xml中定義bean。到目前爲止,這個文件相當簡單,如下所示。但是,當我在一個罐子裏裝這個項目,進口它在另一個項目(我們稱之爲項目B),並嘗試自動裝配DAO實現(在項目B),一個錯誤
Severe: Context initialization failed
java.lang.NoClassDefFoundError: com/mycompany/dao/EntityDao
被拋出。請注意,這個特定的類是通過一個接口實現來定義的,該接口實現在native項目中被自動裝入。
是否因爲我沒有設法正確導入項目B中的項目A,或者是否需要做另一種安排才能使用項目A中的@Repository,@Entity和其他Spring東西?我應該如何使用項目B中的項目A提供的服務?謝謝!
項目B MVC-config.xml中
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.mycompany"/> <mvc:annotation-driven /> <context:annotation-config/> <mvc:default-servlet-handler/> <import resource="classpath*:/WEB-INF/mvc-config.xml" /> <import resource="classpath*:/spring/application-config.xml" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"/> <property name="suffix" value=".jsp"/> </bean>
堆棧跟蹤拋出錯誤:
Severe: Context initialization failed java.lang.NoClassDefFoundError: com/mycompany/EntityDao at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2521) at java.lang.Class.getDeclaredMethods(Class.java:1845) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:571) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:489) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:473) at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:534) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:663) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:593) at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1394) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:385) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:354) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:97) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:609) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) at org.apache.catalina.core.StandardService.start(StandardService.java:525) at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) at org.apache.catalina.startup.Catalina.start(Catalina.java:595) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Caused by: java.lang.ClassNotFoundException: com.mycompany.EntityDao at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) ... 33 more
你似乎在這裏錯了路,首先你的項目有一個mvc-config.xml文件,這意味着它是一個web項目項目,我從來沒有見過在另一個web項目中使用的web項目,如果你打包jar包的項目A,確保它包含WEB-INF文件夾。比確保項目A jar在運行時可用。這是一個maven項目,你如何試圖運行它? – varun 2014-09-25 09:18:03
@varun,事實上,由於整個工作空間的重建,我在之前的Web項目中做了一個「降級」。從您的小技巧中,我決定從一個Spring-Maven簡單項目開始測試相同的架構,並且一切運行良好。事實上,這是我的舊項目的令人回想起的網絡結構,它不適合用作罐子。請給出答案,我會接受它。謝謝。 – Alex 2014-09-25 14:54:39