簡體   English   中英

在eclipse中運行tomcat時,不會從WEB-INF / lib中的jar文件加載spring web應用程序上下文

[英]spring web application context is not loaded from jar file in WEB-INF/lib when running tomcat in eclipse

我正在試驗春天,maven和日食,但在一個奇怪的問題上磕磕絆絆。

我正在使用包含Maven插件的STS(Spring工具套件)插件運行Eclipse Helios SR1。

我想要實現的是一個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項目。 我已經在eclipse中配置了Tomcat 7.0.8的實例,以及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 context(org.test)加載類,並從mvc app context加載控制器。

我還將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服務器的webapps目錄中(也是7.0.8),它可以工作:-(

我錯過了什么?

謝謝您的幫助。

感謝所有試圖回答我的問題的人。 我想我找到了解決自己問題的方法(經過多次挫折之后)

這已經得到了回答

ClassNotFoundException啟動Tomcat時的DispatcherServlet(Maven依賴項未復制到wtpwebapps)

聽起來像是一個spring.jar是從Tomcat內部獲取的,這是一個錯誤的類加載器,因為它看不到你的類。

你是如何在Eclipse中安裝Tomcat的?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM