我一直在阅读关于从包含在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