12

我需要从我的 EJB3 应用程序连接到一个 MongoDB 实例,该应用程序在 glassfish 3.0.1 上运行。Mongo 项目提供了一组驱动程序,我可以在独立的 Java 应用程序中使用它们。

我将如何在 Java EE 应用程序中使用它们?或者更好的措辞:当我的应用程序在 EJB 容器中运行时,我如何使第 3 方库可供我的应用程序使用?

目前,在部署尝试从库中导入的 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 已经存在)。

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

4

6 回答 6

18

嗯……你不应该把这个“驱动程序”放进去glassfishv3/glassfish/domains/domain1/lib/ext吗?

于 2010-03-25T07:05:45.443 回答
9

您可以将共享库放到您域的 lib/ext 中。commons-logging 和 jdbc 驱动程序通常添加在此域路径中。

通用类加载器

GlassFish v2 有一个定义良好的类加载器层次结构,它将通用类加载器标识为处理共享库的正确方法。因此,长话短说,您只需将库和其他框架 JAR 放在 domain/domain1/lib 中即可。

lib/,而不是 lib/ext

问我这个问题的人曾尝试将库放在 domain/domain1/lib/ext 中,这会为 javax.servlet.http.HttpServlet 等核心 Java EE 类触发一个有趣的 ClassNotFoundError。Shing Wai Chan 很快解释说,domains/domain1/lib/ext 是 -Djava.ext.dirs 的一部分,这使得它的任何 JAR 都被视为 JDK 扩展,这意味着放置在那里的 web 应用程序框架将在 webcontainer 实现类之前加载因为它们在类加载器委托链中更高。

于 2010-04-05T18:51:51.427 回答
3

Glassfish 有自己的类加载器层次结构,http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
我在我的项目中遇到了同样的问题,然后我把我所有的第三方库放在domain/domain1/lib 和我的问题解决了。另一方面,通过将库放在 glassfish/lib 中也解决了我的问题。

于 2013-02-05T14:32:21.367 回答
2

在我的情况下,我使用的是 Oracle Express Edition 11gR2 和 Glassfish 3.1.2,在我的情况下唯一可行的方法是将 ojdbc6 放入:

C:\Program Files\glassfish-3.1.2.2\glassfish\lib
于 2013-02-25T01:21:19.720 回答
1
  1. 转到您的 Glassfish 域目录。

  2. 然后转到 lib 文件夹。

  3. 将库放在那里。

  4. 重新启动 glassfish 并运行。

(例如)C:\glassfish3\glassfish\domains\domain1\lib

于 2018-05-07T13:59:10.117 回答
0

尝试将您的库放入 $GF_HOME/glassfish/modules/。它很脏,但会起作用。

于 2016-05-04T08:03:45.070 回答