Как использовать сторонние библиотеки в стеклянной рыбке?

Мне нужно подключиться к экземпляру MongoDB из моего приложения EJB3, работающего на Glassfish 3.0.1. Проект Mongo предоставляет набор драйверов, и я могу использовать их в автономном приложении Java.

Как я могу использовать их в приложении Java EE? Или, может быть, лучше формулировать: как я могу сделать стороннюю библиотеку доступной для моего приложения, когда она запускается в контейнере EJB?

На данный момент я получаю java.lang.NoClassDefFoundError при развертывании bean, который пытается импортировать из библиотеки:

[#|2010-03-24T11:42:15.164+0100|SEVERE|glassfishv3.0|global|_ThreadID=28;_ThreadName=Thread-1;|Class [ com/mongodb/DBObject ] not found. Error while loading [ class mvs.core.LocationCacheService ]|#]
[#|2010-03-24T11:42:15.164+0100|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: com/mongodb/DBObject|#]

[#|2010-03-24T11:42:15.259+0100|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while loading the app
org.glassfish.deployment.common.DeploymentException: java.lang.NoClassDefFoundError: com/mongodb/DBObject
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:171)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:125)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:224)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:338)

Я попытался добавить его в проект NetBeans (Свойства → Библиотеки → Компилировать → Добавить Jar, включить "Пакет" ), и я также попытался вручную скопировать файл jar в $GF_HOME/glassfish/domains/domain1/lib (где уже находится mysql-коннектор).

Нужно ли мне "регистрировать" библиотеку с контейнером? Ссылка на него через аннотацию? Расширить путь к классам контейнера, чтобы включить библиотеку?

Ответ 1

Хм... Разве вы не ставите этот "драйвер" в glassfishv3/glassfish/domains/domain1/lib/ext?

Ответ 2

Вы можете поместить общие библиотеки в lib/ext вашего домена. в этом пути домена часто добавляются генераторы общего доступа и драйверы jdbc.

Общий загрузчик классов

GlassFish v2 имеет четко определенный класс Иерархия загрузчика, которая идентифицирует обычный загрузчик классов как правильный способ для работы с разделяемыми библиотеками. Итак, чтобы сделайте длинную историю короче, поставив вас библиотек и других domains/domain1/lib - все, что вам нужно. сделать.

lib/, а не lib/ext

Человек, задающий мне вопрос, попытался поместить библиотеки в domains/domain1/lib/ext, которые вызвало интересное КлассNotFoundError для ядра Java EE классы, такие как javax.servlet.http.HttpServlet. Shing Вай Чан быстро объяснил, что domains/domain1/lib/ext является частью -Djava.ext.dirs, который делает любой из его JARs считаться расширением JDK что означает рамки веб-приложений будет загружен до классы реализации webcontainer как они выше в загрузчике классов цепочка делегирования.

Ответ 3

Glassfish имеет собственную иерархию загрузчика классов, http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
Я сталкиваюсь с той же проблемой в своем проекте, а затем я помещаю все свои сторонние библиотеки в domain/domain1/lib, и моя проблема решена. С другой стороны, моя проблема также была решена путем помещения библиотек в glassfish/lib.

Ответ 4

В моем случае я использовал Oracle Express Edition 11gR2 и Glassfish 3.1.2, а ТОЛЬКО способ, который работает в моем случае, заключался в том, что ojdbc6:

C:\Program Files\glassfish-3.1.2.2\glassfish\lib

Ответ 5

Попробуйте поместить свои библиотеки в $GF_HOME/glassfish/modules/. Он грязный, но будет работать.