2014-09-24 137 views
0

我一直在閱讀關於從包含在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 
+1

你似乎在這裏錯了路,首先你的項目有一個mvc-config.xml文件,這意味着它是一個web項目項目,我從來沒有見過在另一個web項目中使用的web項目,如果你打包jar包的項目A,確保它包含WEB-INF文件夾。比確保項目A jar在運行時可用。這是一個maven項目,你如何試圖運行它? – varun 2014-09-25 09:18:03

+0

@varun,事實上,由於整個工作空間的重建,我在之前的Web項目中做了一個「降級」。從您的小技巧中,我決定從一個Spring-Maven簡單項目開始測試相同的架構,並且一切運行良好。事實上,這是我的舊項目的令人回想起的網絡結構,它不適合用作罐子。請給出答案,我會接受它。謝謝。 – Alex 2014-09-25 14:54:39

回答

0

你似乎是在這裏錯誤的路徑,首先你的項目有一個mvc-config.xml文件,這意味着它是一個Web項目項目,我從來沒有見過一個Web項目在另一個Web項目中使用,如果你打包項目A作爲jar做確定它包含WEB-INF文件夾。比確保項目A jar在運行時可用。這是一個maven項目,你如何試圖運行它?