контекст весеннего веб-приложения не загружается из файла jar в WEB-INF / lib при запуске tomcat в eclipse - PullRequest
1 голос
/ 20 февраля 2011

Я экспериментирую с spring, maven и eclipse, но спотыкаюсь о странной проблеме.

Я использую Eclipse Helios SR1 с плагином STS (Spring tools suite), который также включает плагин Maven.

Чего я хочу добиться, так это весеннего веб-приложения mvc, которое использует контекст приложения, загруженный из локального XML-файла контекста приложения, а также из других контекстов приложения в зависимостях jar-файлов, включенных в WEB-INF / lib.

В конечном итоге мне хотелось бы, чтобы мой слой постоянства был отделен в своем собственном jar-файле, но содержал свои собственные контекстные файлы Spring с определенной конфигурацией персистентности (например, jpa entityManagerFactory).

Чтобы поэкспериментировать с загрузкой ресурсов из jar-зависимостей, я создал простой проект maven из eclipse, который определяет файл applicationContext.xml в src / main / resources. Внутри я определяю bean-компонент

<bean id="mybean" class="org.test.MyClass" />

и создайте класс в пакете org.test

Я запускаю mvn-> install из eclipse, который генерирует мне файл jar, содержащий мой класс и файл applicationContext.xml:

 testproj.jar
|_META-INF
|_org
    |_test
         |_MyClass.class
|_applicationContext.xml

Затем я создаю проект Spring mvc из проектов шаблонов Spring, предоставленных STS.Я настроил экземпляр Tomcat 7.0.8, а также экземпляр SpringSource tc Server в затмении.Развертывание вновь созданного проекта на обоих серверах работает без проблем.

Затем я добавляю свой предыдущий проект в качестве зависимости maven проекта mvc.JAR-файл правильно добавлен в Maven Dependencies проекта.

В сгенерированном web.xml теперь я хочу загрузить applicationContext.xml из jar-файла, а также существующий файл, сгенерированный дляпроект.Мой 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 наAutoWire MyClass, чтобы проверить, что загрузка контекста работала как задумано.

public class MyController {

@Autowired
    private MyClass myClass;

    public void setMyClass(MyClass myClass) {
        this.myClass = myClass;
    }

    public MyClass getMyClass() {
        return myClass;
    }

[...] 
}

Теперь это странный бит:

Если я разверну Spring Web MVC на моем экземпляре tomcat внутри затмения (запуститьна сервере ...) Я получаю следующую ошибку:

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

Если я создаю файл войны (используя цель maven "установка"), а затем внедряю этот файл войны в каталог webapps автономного tomcatсервер (7.0.8) работает: - (

Что мне не хватает?

Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2011

Спасибо всем, кто пытался ответить на мой вопрос. Я думаю, что нашел решение моей собственной проблемы (после большого разочарования)

На этот вопрос уже отвечали

ClassNotFoundException DispatcherServlet при запуске Tomcat (зависимости Maven, не скопированные в wtpwebapps)

1 голос
/ 20 февраля 2011

Похоже, что spring.jar извлекается изнутри Tomcat, который является неправильным загрузчиком классов, поскольку не может видеть ваши классы.

Как вы установили Tomcat в Eclipse?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...