【问题标题】:spring web application context is not loaded from jar file in WEB-INF/lib when running tomcat in eclipse在 Eclipse 中运行 tomcat 时,未从 WEB-INF/lib 中的 jar 文件加载 Spring Web 应用程序上下文
【发布时间】: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目录中,它可以工作:-(

我错过了什么?

感谢您的帮助。

【问题讨论】:

标签: java eclipse spring tomcat maven


【解决方案1】:

感谢所有试图回答我问题的人。我想我找到了解决自己问题的方法(经过很多挫折)

这已经在

中回答了

ClassNotFoundException DispatcherServlet when launching Tomcat (Maven dependencies not copied to wtpwebapps)

【讨论】:

    【解决方案2】:

    听起来好像是从 Tomcat 内部提取了一个 spring.jar,这是错误的类加载器,因为它看不到您的类。

    你是如何在 Eclipse 中安装上述 Tomcat 的?

    【讨论】:

    • 我已经从 apache 网站下载了 Tomcat 作为 zip,然后在 Preferences->Server->Runtime Environments->Add... 中将 eclipse 指向它,然后在列表中选择 apache Tomcat 7.0 并指向我解压缩它的目录。
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2016-02-06
    • 2010-11-29
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多