2010-03-24 52 views
10

我需要從我的EJB3應用程序連接到運行在glassfish 3.0.1上的MongoDB實例。 Mongo項目提供了一組驅動程序,我可以在獨立的Java應用程序中使用它們。如何在glassfish中使用第三方庫?

我將如何在Java EE應用程序中使用它們?或者更好的措辭:當我的應用程序運行在EJB容器中時,如何使第三方庫可用?

目前,我得到部署時java.lang.NoClassDefFoundError一個bean是 ,嘗試從庫中導入:

[#|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,啓用'Package'),我也嘗試手動將jar文件複製到$ GF_HOME/glassfish/domains/domain1/lib(其中mysql連接器已駐留)。

我是否需要在容器中「註冊」庫?通過註釋引用它?擴展容器的類路徑以包含庫?

回答

17

嗯...你不應該把這個「驅動程序」在glassfishv3/glassfish/domains/domain1/lib/ext

+0

@帕斯卡爾:謝謝!我以爲我也嘗試過這個。無論如何,它就像一種魅力。這是一個好方法嗎?這不應該是部署的一部分嗎? – Hank 2010-03-25 17:39:47

+1

@Hank我不知道如何使用MongoDB驅動程序,但如果容器未使用它(如JDBC驅動程序將創建連接池),也不在域的應用程序之間共享,那麼您應該可能打包它在你的應用程序中。 – 2010-03-25 18:45:06

9

您可以將共享庫放到您的域的lib/ext中。 commons-logging和jdbc驅動程序通常會添加到此域路徑中。

普通的類裝載器

GlassFish v2中有一個明確 類裝載器層次其識別 公共類加載器作爲適當的方式 處理共享庫。所以以 長話短說,把你的 庫和其他框架的JAR放在 domains/domain1/lib中就是你所需要的全部 做的。

的lib /,而不是lib/ext目錄

的人問我這個問題了 試圖把圖書館 域/域1/lib/ext目錄,其 引發了一個有趣的 ClassNotFoundError爲核心的Java EE 類, as javax.servlet.http.HttpServlet。 Shing Wai Chan很快解釋說 domains/domain1/lib/ext是 -Djava.ext.dirs的一部分,它使得它的任何JAR被認爲是JDK擴展 ,這意味着將放置網頁應用程序框架 加載之前 webcontainer實現類爲 他們在類加載器 代表鏈上更高。

+0

您是否使用GlassFish v3嘗試了上述操作? – 2010-04-05 19:10:39

+0

將盡快嘗試glassfish3,但尚未:) http://blogs.sun.com/alexismp/entry/glassfish_equivalent_to_websphere_s – 2010-04-05 19:13:38

+0

這也適用於GlassFish v3/3.1。我已經將我的PGSQL驅動程序放入glassfish/lib中,用於我以前的幾次安裝,並且無需任何其他配置。 – SplinterReality 2010-11-29 01:45:02

2

在我的情況下,我使用的是Oracle Express Edition 11gR2和Glassfish 3.1。2,在我的情況下工作的唯一辦法是把ojdbc6在:

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

儘量把你的庫到$ GF_HOME/GlassFish中/模塊/。 它很髒,但會起作用。