Можно ли использовать class.forname для загрузки класса, который существует в модуле, связанном с Spring? - PullRequest
1 голос
/ 26 сентября 2010

У меня есть два модуля maven и мне нужен класс A в модуле 1 для загрузки класса B в модуль 2 с помощью class.forname. это работает очень хорошо, и я могу вызывать правильные методы в классе B вообще без проблем. Модуль 1 подключен с помощью пружины, и я хотел бы подключить модуль 2 таким же образом для согласованности. Я попробовал это и скомпилировал это без проблем. но когда я пытаюсь запустить код, у меня возникает много проблем. Во-первых, он не может найти различные классы весны, такие как ApplicationContext. Зависимости существуют в pom модуля 2. Чтобы решить проблему, мне пришлось добавить все пружинные банки в мою папку lib в JBoss.

Как только они добавлены, кажется, что все проблемы устранены, но затем я получаю следующую проблему: -

org.springframework.beans.FatalBeanException: класс [org.springframework.beans.factory.xml.UtilNamespaceHandler] для пространства имен [http://www.springframework.org/schema/util] не поддерживает [org.springframework.beans.factory.xml.NamespaceHandler] 1009 *

и я не могу понять почему. То, что я пытаюсь сделать, достижимо?

1 Ответ

2 голосов
/ 27 сентября 2010

Это не проблема Maven или Spring, так как оба не используют магию пути к классам.Это проблема вашего развертывания и упаковки.

Убедитесь, что оба модуля объявлены как имеющие область действия время выполнения (или значение по умолчанию) в вашем pom.xml.Пакет .war или .ear, который вы упаковываете, должен содержать как файлы jar модуля, так и их зависимости.Никогда не копируйте никакие библиотеки в папку lib сервера, если вы действительно не знаете, что делаете.

Также убедитесь, что ваш окончательный архив не должен содержать повторяющихся записей !Это очень важно.Если вы используете Spring, убедитесь, что в вашем архиве приложений нет файлов spring.jar, а есть только файлы spring-xxxxx.jar.Если у вас есть, например, spring-beans.jar и spring.jar, что-то не так в вашем управлении зависимостями в poml.xml.Также удалите библиотеки Spring, которые вы добавили в папку lib на сервере.

Проверьте версии ваших зависимостей.Хотя Maven должен защищать вас от большинства ошибок, убедитесь, что в вашем classpath нет библиотеки с несколькими версиями.

Если вы используете Class.forName(String), вам следует вместо Class.forName(String,ClassLoader) и использовать приложенияClassLoader.По умолчанию ClassLoader, используемое Class.forName(), является потоком ContextClassLoader (TCCL).Не уверен, что это правильный вариант для вашего случая.Если вы используете какой-либо фреймворк, который выполняет динамическую загрузку классов, ткачество и т. Д., Вы можете попытаться установить TCCL по своему усмотрению.

Другой вариант, если все не удается, - проверить, нужно ли инвертировать ClassLoaderМодель делегации JBoss.См. JBoss Class Loader HOW-TO

...