2010-03-24 3 views
10

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

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

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

[#|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-коннектор).

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

ответ

17

Хм ... Разве вы не должны помещать этот «драйвер» в glassfishv3/glassfish/domains/domain1/lib/ext?

+0

@Pascal: спасибо! Я думал, я тоже это пробовал. Во всяком случае, работает как шарм. Это хороший способ? Разве это не должно быть частью развертывания? – Hank

+1

@Hank Я не знаю, как используется драйвер MongoDB, но если он не используется контейнером (например, JDBC-драйвер должен был создать пул соединений) и не использоваться совместно с приложениями домена, тогда вы должны, возможно, упаковать это внутри вашего приложения. –

9

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

Общий класс Loader

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

Библиотека /, а не Lib/внутр

Человек задавал мне вопрос был попытался положить библиотеки в доменов/domain1/Библиотека/внутр который вызвал интересную ClassNotFoundError для ядра Java EE классов таких как javax.servlet.http.HttpServlet. Shing Wai Chan быстро объяснить, что домены/domain1/Библиотека/вн является частью -Djava.ext.dirs, что делает любой из его баночки можно рассматривать как расширение JDK что означает рамки веб-приложения размещены будет загружен до классов реализации webcontainer как они выше в classloader цепочка делегирования.

+0

Вы попробовали выше с GlassFish v3? –

+0

попробует glassfish3 как можно скорее, но еще нет :) http://blogs.sun.com/alexismp/entry/glassfish_equivalent_to_websphere_s –

+0

Это также работает с GlassFish v3/3.1. Я поместил свой PGSQL-драйвер в glassfish/lib для моих последних нескольких установок, и он работает без какой-либо дополнительной настройки. – SplinterReality

3

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

2

В моем случае я использовал Oracle Express Edition 11gR2 и Glassfish 3.1.2 и единственный способ, который работает в моем случае помещал ojdbc6 в:

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

Try положить вашу LIBS в $ GF_HOME/GlassFish/модули /. Это грязно, но будет работать.

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