2013-06-15 7 views
4

JBoss EAP 6.1 standlone серверOracle JDBC конфликт драйвера

Применение развертывается в качестве военного файла выбрасывает исключение во время выполнения

java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY 

на линии

oracle.sql.ARRAY obj = (oracle.sql.ARRAY) rs.getObject("RATINGOBJ"); 

JDBC libary включен ojdbc6.jar (WEB_INF/Библиотека). Все библиотеки включены в военный файл, и на сервере нет «глобальных» наборов libaries. Я подтвердил, что никакие другие библиотеки jdbc не включены нигде в приложении.

Чтобы создать источник данных JDBC, я создал развертывание для ojdbc6.jar. Это единственный возможный источник конфликта, о котором я могу думать. Когда я удаляю ojdbc6.jar из файла войны, я получаю исключение ClassNotFound вместо ClassCastException.

Каждая другая часть приложения работает отлично, за исключением этой строки. Как мне отладить это дальше?

+0

Возможно, попробуйте запустить очень простое тестовое приложение только с драйвером JDBC в качестве зависимости? – fge

+0

Это происходит только изредка? Вы перезапускаете сервер при каждом повторном развертывании приложения? –

+0

Каждый раз, когда я развертываю приложение, я перезапускаю сервер. Я не думаю, что это необходимо, но я все равно. – BBS

ответ

2

Я не уверен, почему загрузка из web-inf/lib не будет работать. Скорее всего, классный загрузчик отличается.

Сделайте первые два шага для диагностики. После этого попробуйте один из двух вариантов ниже, чтобы устранить проблему.
1) Проверьте, одинаковы ли загрузчики классов, сравнивая rs.getObject().getClass('RATINGOBJ').getClassLoader() и oracle.sql.ARRAY.class.getClassLoader() Если вы выполняете equals между двумя загрузчиками классов, он должен возвращать значение false, поскольку выглядит, что загрузчики классов различны. Проверьте объяснение в ClassCastException when casting to the same class

Эта проблема уже сообщалось ранее на другом форуме в https://forums.oracle.com/message/9330314. Перемещение банок в jboss все равно приведет к таким же проблемам.

2) Узнайте исходные банки, откуда загружаются классы, и удалите банку, в которой вы не нуждаетесь. Найти банки для двух различных классов, проверяя
rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation() oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation() - Determine which JAR file a class is from

Возможные решения:

а) Если вам нужны обе банки, y'll должны двигаться банкой rs.getObject().getClass('RATINGOBJ').getProtectionDomain().getCodeSource().getLocation()

и создать модуль, как указано в http://www.javaworld.com/community/node/8184.

b) Если вы все еще не можете загружать классы, как вы ожидаете, укажите библиотеку в библиотеке jboss-сервера.

c) Последнее решение для принудительной загрузки классов из конкретной банки состоит в том, чтобы указать банку в bootclasspath.

+0

'******* Object classloader = ModuleClassLoader для модуля" deployment.ojdbc5.jar: main "из загрузчика сервисного модуля ******* Класс classloader = ModuleClassLoader для развертывания модуля. Dispatch.war: main «from Service Module Loader ******* Объект jarLoc = vfs: /content/ojdbc5.jar ******* Класс jarLoc = vfs: /content/Dispatch.war/WEB -INF/lib/ojdbc5.jar ********* Классные погрузчики разные *********** ' Отпечатанные значения, которые вы указали. Погрузчики классов кажутся разными. На сервере есть 2 развертывания, ojdbc5.jar для создания DataSource и самого приложения, которое включает в себя ojdbc5.jar – BBS

+0

Я до сих пор не смог найти серверную библиотеку для JBoss EAP. Если я удалю ojdbc5.jar из WEB_INF/lib, я получаю ClassNotFound и если я его включу. он конфликтует с тем же банком, который я установил в качестве модуля, который будет использоваться при создании DataSource. Я постараюсь проверить ваши возможные решения завтра. Благодарю. – BBS

+0

Я смог исправить эту проблему с помощью решения A. Создал модуль с ojdbc6.jar. Используется для определения драйвера и создания источника данных. Также добавлен jboss-deployment-structure.xml в войну приложения, чтобы ссылаться на этот модуль, а не включать его в WEB-INF/lib. Classloaders теперь показывают то же самое, и все, кажется, работают хорошо на данный момент. Что-то сложное в том, что я новичок в JBoss и не понял различий между JBoss EAP 6 от RedHat и JBoss AS 7. Спасибо за все ваши данные. – BBS

3

У вас не должно быть JAR-драйверов JDBC на уровне WEB-INF/lib. Серверы приложений Java EE нуждаются в том, чтобы они находились на уровне сервера приложений.

Переместите его в каталог по умолчанию/lib по умолчанию и посмотрите, лучше ли это.

+0

Не это только в том случае, если вы хотите, чтобы контейнер предоставлял, например. пул соединений с базами данных? Если вы делаете все сами, вам это не нужно. –

+0

Правда, но зачем использовать сервер приложений и * не использовать пул соединений? Tomcat делает это требование сейчас, и JBOSS-сервлет/JSP-движок является вилкой Tomcat. – duffymo

+0

Согласен. Я думаю, что это вещь ClassLoader. – darijan

Смежные вопросы