【问题标题】:How to use 3rd party libraries in glassfish?如何在 glassfish 中使用 3rd 方库?
【发布时间】:2010-03-24 11:08:00
【问题描述】:

我需要从我的 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 已经存在的地方)。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @Pascal:谢谢!我以为我也试过这个。无论如何,就像一个魅力。这是一个好方法吗?这不应该是部署的一部分吗?
    • @Hank 我不知道 MongoDB 驱动程序是如何使用的,但如果容器不使用它(如 JDBC 驱动程序将用于创建连接池),也不知道在应用程序之间共享域,那么您应该将其打包到您的应用程序中。
    【解决方案2】:

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

    通用类加载器

    GlassFish v2 有一个定义明确的类 加载程序层次结构,它标识 通用类加载器作为正确的方法 处理共享库。所以要 长话短说,把你 库和其他框架 JAR 在 domain/domain1/lib 就是你所需要的 做。

    lib/,不是 lib/ext

    问我这个问题的人有 试着把图书馆放进去 域/域1/lib/ext 其中 引发了一个有趣的 核心 Java EE 的 ClassNotFoundError 类如 javax.servlet.http.HttpServlet。盛 Wai Chan很快解释说 domain/domain1/lib/ext 是 -Djava.ext.dirs 使其任何 JAR 都被视为 JDK 扩展 这意味着放置了 Web 应用程序框架 之前会有加载 webcontainer 实现类为 它们在类加载器中更高 委托链。

    【讨论】:

    • 您是否使用 GlassFish v3 尝试过上述操作?
    • 将尽快尝试 glassfish3 但还没有:) blogs.sun.com/alexismp/entry/…
    • 这也适用于 GlassFish v3/3.1。在过去的几次安装中,我已将 PGSQL 驱动程序放入 glassfish/lib 中,它无需任何额外配置即可工作。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      C:\Program Files\glassfish-3.1.2.2\glassfish\lib
      

      【讨论】:

        【解决方案5】:
        1. 转到您的 Glassfish 域目录。

        2. 然后进入lib文件夹。

        3. 将库放在那里。

        4. 重新启动 glassfish 并运行。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-03
            • 1970-01-01
            相关资源
            最近更新 更多