我需要从我的EJB3应用程序连接到MongoDB实例,在glassfish 3.0.1上运行.Mongo项目提供了一组驱动程序,我可以在独立的Java应用程序中使用它们.
我如何在Java EE应用程序中使用它们?或者更好的措辞:当我的应用程序在EJB容器中运行时,如何使第三方库可用于我的应用程序?
目前,在部署尝试从库导入的bean时,我收到了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-connector已驻留).
我是否需要使用容器"注册"库?通过注释引用它?扩展容器的类路径以包含库?
嗯......你不应该把这个"司机"放进去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.Shing Wai Chan很快解释了domains/domain1/lib/ext是-Djava.ext.dirs的一部分,它使得任何JAR都被视为JDK扩展,这意味着放置在那里的Web应用程序框架将在webcontainer实现类之前加载因为他们在类加载器委托链中更高.