如何在glassfish中使用第三方库?

时间:2010-03-24 11:08:00

标签: mongodb glassfish java-ee-6 glassfish-3

我需要从我的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已驻留的位置)。

我是否需要使用容器“注册”库?通过注释引用它?扩展容器的类路径以包含库?

6 个答案:

答案 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)

  1. 转到Glassfish doamin目录。

  2. 然后转到lib文件夹。

  3. 将库放在那里。

  4. 重启glassfish并运行。

  5. (Ex)C:\ glassfish3 \ glassfish \ domains \ domain1 \ lib