2010-03-24 35 views
10

Tôi cần kết nối với một cá thể MongoDB từ ứng dụng EJB3 của tôi, chạy trên glassfish 3.0.1. Dự án Mongo cung cấp một bộ trình điều khiển và tôi có thể sử dụng chúng trong một ứng dụng Java độc lập.Làm cách nào để sử dụng thư viện của bên thứ 3 trong thủy tinh?

Làm cách nào để sử dụng chúng trong ứng dụng Java EE? Hoặc có thể nói cách khác tốt hơn: làm thế nào tôi có thể làm cho một thư viện của bên thứ ba có sẵn cho ứng dụng của tôi khi nó chạy trong một thùng chứa EJB?

Tại thời điểm này, tôi nhận được một java.lang.NoClassDefFoundError khi triển khai một bean mà cố gắng để nhập khẩu từ thư viện:

[#|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) 

Tôi đã cố gắng thêm nó vào dự án NetBeans (Properties -> Thư viện -> Biên dịch -> Thêm Jar, bật 'Gói'), và tôi cũng đã thử sao chép thủ công tệp jar thành $ GF_HOME/glassfish/domains/domain1/lib (nơi mà trình kết nối mysql đã cư trú).

Tôi có cần 'đăng ký' thư viện với vùng chứa không? Tham khảo nó qua Chú thích? Mở rộng đường dẫn lớp của vùng chứa để bao gồm thư viện?

Trả lời

17

Hmm ... Bạn không nên đặt "trình điều khiển" này vào glassfishv3/glassfish/domains/domain1/lib/ext?

+0

@Pascal: cảm ơn bạn! Tôi nghĩ rằng tôi đã thử điều này, quá. Dù sao, hoạt động như một say mê. Đó có phải là cách tốt không? Điều này có nên là một phần của việc triển khai không? – Hank

+1

@Cảm ơn Tôi không biết trình điều khiển MongoDB được sử dụng như thế nào nhưng nếu nó không được sử dụng bởi thùng chứa (như trình điều khiển JDBC để tạo hồ bơi kết nối) cũng không được chia sẻ giữa các ứng dụng của miền. nó bên trong ứng dụng của bạn. –

9

Bạn có thể đặt libs được chia sẻ vào lib/ext của miền của mình. các trình điều khiển commons-logging và jdbc thường được thêm vào trong đường dẫn miền này.

Lớp Common Loader

GlassFish v2 có được xác định rõ Lớp Loader hệ thống phân cấp trong đó xác định các lớp phổ biến nạp là cách thích hợp để đối phó với các thư viện chia sẻ. Vì vậy, để làm cho một câu chuyện dài ngắn, đưa bạn thư viện và các khung JAR khác trong tên miền/miền1/lib là tất cả những gì bạn cần để làm.

lib /, không lib/ext

Người hỏi tôi những câu hỏi thăm đã cố gắng đặt các thư viện trong lĩnh vực/domain1/lib/ext mà kích hoạt một ClassNotFoundError thú vị cho lõi Java EE lớp học như vậy là javax.servlet.http.HttpServlet. Shing Wai Chan đã nhanh chóng giải thích rằng tên miền/domain1/lib/ext là một phần của -Djava.ext.dirs làm cho bất kỳ JAR nào của nó được coi là phần mở rộng JDK có nghĩa là khung ứng dụng web được đặt sẽ có được tải trước các lớp triển khai webcontainer là chúng cao hơn trong trình tải lớp học chuỗi đoàn đại biểu.

+0

Bạn đã thử làm như thế với GlassFish v3 chưa? –

+0

sẽ cố gắng glassfish3 càng sớm càng tốt nhưng chưa :) http://blogs.sun.com/alexismp/entry/glassfish_equivalent_to_websphere_s –

+0

Điều này cũng hoạt động với GlassFish v3/3.1. Tôi đã đặt trình điều khiển PGSQL của tôi vào glassfish/lib cho vài lần cài đặt trước đây của tôi và nó hoạt động mà không cần bất kỳ cấu hình bổ sung nào. – SplinterReality

3

Glassfish đã sở hữu hệ thống phân cấp lớp loader, http://docs.oracle.com/cd/E19798-01/821-1752/beade/index.html
tôi phải đối mặt với cùng một vấn đề trong dự án của tôi và sau đó tôi đặt tất cả các thư viện của bên thứ ba của tôi trong phạm vi/domain1/lib và vấn đề của tôi được giải quyết. Nói cách khác, vấn đề của tôi cũng được giải quyết bằng cách đặt các thư viện trong glassfish/lib.

2

Trong trường hợp của tôi, tôi đã sử dụng Oracle Express Edition 11gR2 và Glassfish 3.1.2 và cách duy nhất hoạt động trong trường hợp của tôi là đặt ojdbc6 vào:

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

Cố gắng đặt libs của bạn vào $ GF_HOME/glassfish/modules /. Nó bẩn, nhưng sẽ hoạt động.

Các vấn đề liên quan