Я должен соединиться с экземпляром MongoDB из своего приложения EJB3, работая на glassfish 3.0.1. Проект монго обеспечивает ряд драйверов, и я могу использовать их в автономном 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 (Свойства-> Библиотеки->, Компиляция-> Добавляет Банку, включает 'Пакет'), и я также пытался вручную копировать файл банки в $GF_HOME/glassfish/domains/domain1/lib (где mysql-коннектор уже находится).
Я должен 'зарегистрировать' библиотеку в контейнере? Сослаться на него с помощью Аннотации? Расширить путь к классу контейнера для включения библиотеки?
Хм ... Разве вы не должны поместить этот "драйвер" в glassfishv3 / glassfish / domains / domain1 / lib / ext
?
Вы можете поместить общие библиотеки в lib / ext вашего домена. Драйверы commons-logging и jdbc часто добавляются в этот путь домена.
Загрузчик общих классов
GlassFish v2 имеет четко определенную иерархию загрузчиков классов , которая определяет загрузчик общих классов как правильный способ работы с разделяемыми библиотеками.Итак, чтобы короче говоря, все, что вам нужно - это поместить библиотеки и другие JAR-файлы фреймворка в domains / domain1 / lib.
lib /, а не lib / ext
Человек, задававший мне вопрос, пытался поместить библиотеки в domains / domain1 / lib / ext, что вызвало интересный ClassNotFoundError для основных классов Java EE , таких как javax.servlet.http.HttpServlet. Шинг Вай Чан быстро объяснил, что domains / domain1 / lib / ext является частью -Djava.ext.dirs, что делает любой из его JAR-файлов JDK extension , что означает, что размещенные фреймворки веб-приложений будут загружены до классов реализации веб-контейнера, поскольку они находятся выше в цепочке делегирования загрузчика классов .