12

グラスフィッシュ 3.0.1 で実行されている EJB3 アプリケーションから MongoDB インスタンスに接続する必要があります。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 はすでに存在します)。

ライブラリをコンテナーに「登録」する必要がありますか? 注釈経由で参照しますか? コンテナのクラスパスを拡張してライブラリを含めますか?

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/ext ではなく lib/

私に質問した人は、ライブラリを 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 を使用していました。

C:\Program Files\glassfish-3.1.2.2\glassfish\lib
于 2013-02-25T01:21:19.720 に答える