我需要从我的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已驻留的位置)。
我是否需要使用容器“注册”库?通过注释引用它?扩展容器的类路径以包含库?
答案 0 :(得分:17)
嗯......你不应该把这个“司机”放在glassfishv3/glassfish/domains/domain1/lib/ext
吗?
答案 1 :(得分:9)
您可以将共享库放到域的lib / ext中。 commons-logging和jdbc驱动程序通常会添加到此域路径中。
Common Class Loader
GlassFish v2有一个定义良好的类 标识符的加载程序层次结构 通用类加载器作为正确的方法 处理共享库。所以 长话短说,把你 库中的库和其他框架JAR 您只需要域/域1 / lib即可 做。
lib /,而不是lib / ext
问我这个问题的人有 试图把库放进去 domains / domain1 / lib / ext 引发了一场有趣的 核心Java EE的ClassNotFoundError 类如 javax.servlet.http.HttpServlet。盛 Wai Chan很快解释了这一点 domains / domain1 / lib / ext是其中的一部分 -Djava.ext.dirs使其任何JAR被视为JDK扩展 这意味着放置了Web应用程序框架 之前会加载 webcontainer实现类为 他们在类加载器中更高 代表团链。
答案 2 :(得分:3)
Glassfish拥有自己的类加载器层次结构http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
我在项目中面临同样的问题,然后我将所有第三方库放在domain / domain1 / lib中,我的问题解决了。在另一方面,我的问题也通过将库放在glassfish / lib中来解决。
答案 3 :(得分:2)
在我的情况下,我使用的是Oracle Express Edition 11gR2和Glassfish 3.1.2,在我的案例中唯一适用的方法是将ojdbc6放入:
C:\Program Files\glassfish-3.1.2.2\glassfish\lib
答案 4 :(得分:0)
尝试将您的lib放入$ GF_HOME / glassfish / modules /。 它很脏,但会起作用。
答案 5 :(得分:0)
转到Glassfish doamin目录。
然后转到lib文件夹。
将库放在那里。
重启glassfish并运行。
(Ex)C:\ glassfish3 \ glassfish \ domains \ domain1 \ lib