Как использовать сторонние библиотеки в glassfish?
Мне нужно подключиться к экземпляру MongoDB из моего приложения EJB3, работающего на glassfish 3.0.1. Проект Mongo предоставляет набор драйверов, и я могу использовать их в автономном приложении Java.
Как бы я использовал их в приложении Java EE? Или, может быть, лучше сформулировать: как сделать стороннюю библиотеку доступной для моего приложения, когда она работает в контейнере EJB?
на данный момент я получаю java.ленг.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-connector уже находится).
Мне нужно "зарегистрировать" библиотеку с контейнером? Ссылаться на него через аннотацию? Расширить путь к классам контейнера, чтобы включить библиотеку?
6 ответов
вы можете поместить общие библиотеки в lib / ext вашего домена. драйверы commons-logging и JDBC часто добавляются в этот путь домена.
Общий Загрузчик Class
GlassFish v2 имеет четко определенный класс Иерархия загрузчика, идентифицирующая Common class loader как правильный способ для работы с общими библиотеками. Так короче говоря, положить вам библиотеки и другие фреймворки в Домены / domain1/lib-это все, что вам нужно делать.
lib/, не lib / ext
человек, задающий мне этот вопрос попробовал поместить библиотеки в Домены / domain1/lib / ext которые спровоцировал интересный ClassNotFoundError для ядра Java EE такие классы, как класса javax.сервлет.http.Он полностью реализует интерфейс. Шинг Вай Чан быстро объяснил, что Домены / domain1/lib/ext является частью - Джава.доб.dirs, который делает любой из его банок рассматриваться как расширение JDK это означает, что рамки веб-приложений размещены там будет загружен до классы реализации webcontainer как они выше в classloader цепочка делегирования.
Glassfish имеет собственную иерархию загрузчика классов,http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
Я сталкиваюсь с той же проблемой в своем проекте, а затем помещаю все свои сторонние библиотеки в домен/domain1/lib, и моя проблема решена. С другой стороны, моя проблема также была решена путем размещения библиотек в glassfish/lib.
в моем случае я использовал Oracle Express Edition 11gR2 и Glassfish 3.1.2, и единственный способ, который работает в моем случае, - это поместить ojdbc6 в:
C:\Program Files\glassfish-3.1.2.2\glassfish\lib
перейдите в каталог Glassfish doamin.
затем перейдите в папку lib.
поместите туда библиотеки.
перезапустите glassfish и запустите.
(Ex) C:\glassfish3\glassfish\domains\domain1\lib