Проблемы развертывания с приложением Spring в Tomcat 6.0 - PullRequest
1 голос
/ 09 декабря 2011

У меня проблемы с развертыванием веб-приложения Spring в Tomcat 6.0.Я хочу развернуть несколько jar-файлов в shared / lib (catalina.properties настроен правильно);Эти банки содержат различные определения бинов.Основное приложение, развернутое в каталоге webapps, использует:

<import resource="classpath*:com/**/*.xml"/>

, чтобы выбрать определения bean-компонентов в jar-файлах, развернутых в shared / lib.

Некоторые из bean-компонентов, развернутых в shared /lib была обновлена ​​и теперь реализует интерфейс MessageSourceAware;при запуске приложения я получаю следующую ошибку:

Caused by: java.lang.NoClassDefFoundError: org/springframework/context/MessageSourceAware
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1667)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1282)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)
    ... 72 more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.MessageSourceAware
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 89 more

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

Это похоже на проблему загрузчика классов, но к моменту загрузки еще не было загружено spring-context.jar в WEB-INF / libSpring пытается создать bean-компоненты в общих / lib банках?

Я в замешательстве;любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

В конце концов понял, что папка shared / lib - это именно неправильное место для размещения этих расширений jar, вследствие иерархической природы загрузчиков классов в Tomcat.написал мой собственный загрузчик классов, который расширяет Tomcat WebappClassLoader:

public class CustomWebappClassLoader extends WebappClassLoader {

    public CustomWebappClassLoader() {
        super();
        addCustomRepository();
    }

    public CustomWebappClassLoader(ClassLoader parent) {
        super(parent);
        addCustomRepository();
    }

    private void addCustomRepository() {
        String catalinaHome = System.getProperty("catalina.home");
        File dir = new File(catalinaHome, String.format("extensions%slib", File.separator));
        for (File file : dir.listFiles()) {
            if (file.getName().endsWith(".jar")) {
                String repository = String.format("file:/%s", file.getAbsolutePath());
                addRepository(repository);
            }
        }
    }
}

Это добавляет любые jar в% CATALINA_HOME% / extensions / lib к пути к классам (вместе с WEB-INF / classes и WEB-INF / lib дляapplication).

Затем в context.xml необходима следующая строка:

<Loader loaderClass="com.test.CustomWebappClassLoader" delegate="true"/>
1 голос
/ 09 декабря 2011

Добавьте файл jar, содержащий org.springframework.context.MessageSourceAware, в путь к классам. Если вы используете Eclipse (я так полагаю), щелкните правой кнопкой мыши на проекте и выберите Build Path. И добавьте соответствующий файл jar в classpath.

0 голосов
/ 09 декабря 2011

Вам нужно будет включить spring-context-x.y.z.jar в папку проекта WEB-INF/lib или в папку TOMCAT_HOME/lib (где x, y, z - номер версии).

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