【发布时间】:2011-06-30 17:17:21
【问题描述】:
我正在尝试使用 spring、maven 和 eclipse,但遇到了一个奇怪的问题。
我正在运行带有 STS(Spring 工具套件)插件的 Eclipse Helios SR1,该插件还包括 Maven 插件。
我想要实现的是一个 spring mvc webapp,它使用从本地应用程序上下文 xml 文件加载的应用程序上下文,也从 WEB-INF/lib 中包含的 jar 文件依赖项中的其他应用程序上下文加载。
我最终想做的是将我的持久层分离在它自己的 jar 文件中,但包含它自己的带有持久性特定配置的 spring 上下文文件(例如 jpa entityManagerFactory)。
所以为了尝试从 jar 依赖项加载资源,我从 eclipse 创建了一个简单的 maven 项目,它在 src/main/resources 中定义了一个 applicationContext.xml 文件 在里面,我定义了一个 bean
<bean id="mybean" class="org.test.MyClass" />
并在 org.test 包中创建类
我从 Eclipse 运行 mvn->install,它会生成一个包含我的类和 applicationContext.xml 文件的 jar 文件:
testproj.jar
|_META-INF
|_org
|_test
|_MyClass.class
|_applicationContext.xml
然后我从 STS 提供的 Spring 模板项目创建一个 spring mvc 项目。 我已经配置了 Tomcat 7.0.8 的实例,以及 eclipse 中的 springSource tc Server 的实例。在两台服务器上部署新创建的项目都没有问题。
然后我将我以前的项目添加为 mvc 项目的 maven 依赖项。 jar 文件已正确添加到项目的 Maven 依赖项中。
在生成的 web.xml 中,我现在想从 jar 文件以及为项目生成的现有文件加载 applicationContext.xml。我的 web.xml 现在看起来像这样:
org.springframework.web.context.ContextLoaderListener
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext.xml,
/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
另外,在我的 servlet-context.xml 中,我有以下内容:
<context:component-scan base-package="org.test" />
<context:component-scan base-package="org.remy.mvc" />
从 jar spring 上下文 (org.test) 加载类并从 mvc 应用程序上下文加载控制器。
我还将 org.remy.mvc 中的一个控制器更改为自动装配 MyClass 以验证加载上下文是否按预期工作。
public class MyController {
@Autowired
private MyClass myClass;
public void setMyClass(MyClass myClass) {
this.myClass = myClass;
}
public MyClass getMyClass() {
return myClass;
}
[...]
}
现在这是奇怪的一点:
如果我在 eclipse 中的我的 tomcat 实例上部署 spring mvc web(在服务器上运行...),我会收到以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/test/MyClass
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
at javax.servlet.GenericServlet.init(GenericServlet.java:160)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1133)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1087)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4834)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5155)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5150)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoClassDefFoundError: org/test/MyClass
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:446)
at org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(DefaultAnnotationHandlerMapping.java:172)
at org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.determineUrlsForHandler(DefaultAnnotationHandlerMapping.java:118)
at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:79)
at org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58)
at org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:119)
at org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:72)
at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)
at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:106)
at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:85)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:394)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1413)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 25 more
20-Feb-2011 10:54:53 org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/test/MyClass
如果我构建war文件(使用maven“安装”目标),然后将该war文件部署在独立tomcat服务器(7.0.8)的webapps目录中,它可以工作:-(
我错过了什么?
感谢您的帮助。
【问题讨论】:
-
如果你检查你生产的 jar,
org.test.MyClass是否存在? -
是的...并且 jar 也存在于战争文件 WEB-INF/lib 中。 Eclipse 也不报告任何错误。我唯一能想到的是,tomcat的类加载器在eclipse中加载时的行为与独立运行时不同。但我不知道如果是这种情况该怎么办
标签: java eclipse spring tomcat maven