0

英語は私の母国語ではないので、事前にお詫び申し上げます。ejbサービスを提供するJavaサーバーアプリケーションに接続するスタンドアロンクライアント(grailsで作成された-groovyフレームワーク)をテストするのに問題がありました。

corbaとwsdlの両方を介して接続しようとしましたが、どちらの方法でもコンテキスト()の初期化に失敗します。これは、アプリを実行したときにInitialContextクラス()が欠落していると表示されるためです(組み込みのjetty grailsサーバーを使用)。NoClassDefFoundErrorこのクラスを含むjarがあり、このjarがクラスパスにあり、grailsアプリケーションのlibフォルダーにあるファイルであるため、このクラスはクラスパスに含まれているはずです。

これは、サービスを呼び出すためにBeanを初期化しようとする方法です。

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory")
p.setProperty("org.omg.CORBA.ORBInitialHost", iProperties.getINTEGRATION_IP())
p.setProperty("org.omg.CORBA.ORBInitialPort", iProperties.getCORBA_PORT())
try{
    ctx = new InitialContext(p)
    authWS = (AdmAuthenticationRemote) ctx.lookup(AUTHENTICATION_SERVICE_JNDI); // CORBA
} catch(Throwable e){
    ctx = new InitialContext(p)
    authenticationWS = (AdmAuthenticationRemote) ctx.lookup(REMOTE_CLASS_PACKAGE_NAME) // WSDL
}

上記のコードには「;」はありません 原因groovyはJavaコードを実行するためにそれらを必要としません。このコードをnetbeans環境の小さなアプリでテストしたところ、両方とも機能しました。grailsアプリでこれを実行しようとすると、問題が発生します。

これは、サービスを呼び出そうとしたときに発生するエラーです。

NoClassDefFoundError: org/jvnet/hk2/component/MultiMap

もちろん、これは完全なスタックではありませんが、これが問題の原因です(スタック内で発生します)。このクラス(org.jvnet.hk2.component.MultiMap)はファイルauto-depends.jar(glassfishのjarファイル)に含まれています。gf-client.jarアプリがすべてのglassfishjarをクラスパスに呼び出すようにappserv-rt.jar(glassfish jarも)ライブラリに追加しようとしましたが、これは機能しませんでした。スタンドアロンアプリでは、クラスを含むjarを手動で追加する必要があることがわかりました(あなたは私appserv-rt.jarがnetbeansテストファイルに追加して機能しました!)それで私はこのjarファイルを私のlibフォルダに追加しました:

appclient.security.jar
auto-depends.jar
common-util.jar
config-api.jar
config.jar
config-types.jar
connectors-admin.jar
connectors-inbound-runtime.jar
connectors-internal-api.jar
connectors-runtime.jar
container-common.jar
deployment-common.jar
dol.jar
ejb-container.jar
ejb-internal-api.jar
ejb.security.jar
glassfish-api.jar
glassfish-corba-asm.jar
glassfish-corba-codegen.jar
glassfish-corba-csiv2-idl.jar
glassfish-corba-newtimer.jar
glassfish-corba-omgapi.jar
glassfish-corba-orbgeneric.jar
glassfish-corba-orb.jar
glassfish.jar
glassfish-naming.jar
gmbal.jar
hk2-core.jar
internal-api.jar
javax.ejb.jar
kernel.jar
management-api.jar
orb-connector.jar
orb-enabler.jar
orb-iiop.jar
security.jar
tiger-types-osgi.jar

もちろん、Glassfishサーバーのサービスにアクセスするために必要なリモートインターフェイスとサービスオブジェクトを含むjarもあります。これを行っても、このエラーは発生し続けます。私はアイデアがなく、この問題で立ち往生していて、それを解決する方法がわかりません。私の質問は、この例外をどのように解決するのですか?グレイルズの問題ですか?いくつかのgrailsファイルを構成していませんか?どんな考えでもいただければ幸いです。

前もって感謝します

ケビン

更新:クリーンコマンドを実行してコマンドをコンパイルすると、前のエラーの代わりにこのエラーが発生することも発見しました:

java.lang.ClassNotFoundException: org.jvnet.hk2.component.Inhabitant

なぜこれが発生するのかわかりませんが、サーバーを(クリーンコンパイルせずに)再起動すると、前のエラーが発生します。

4

2 に答える 2

0

すべてのglassfish jarファイル(libおよびモジュール)をプロジェクトのlibフォルダーに追加することで彼の問題を解決できましたが、サービスの呼び出しにはまだ問題があります。

私が抱えている新しい問題の詳細を記載した別の投稿を作成しました。

grails スタンドアロン クライアントから EJB サービスにアクセスする方法

于 2013-01-23T18:40:39.537 に答える
0

lib フォルダーに auto-depends.jar を追加しました。grails WARファイルがそれを見るはずだと思います。しかし、grails がその jar を run-app モードで使用するようにするには、おそらく依存関係も登録する必要があります。BuildConfig.groovy に次の行を追加します。

grails.project.dependency.resolution = {
    //.....
    dependencies {
        //.....

        runtime ':glassfish-auto-depends:1'

    }
    //.....
}

auto-depends.jar の名前を glassfish-auto-depends-1.jar に変更します (「-1」は必須のバージョンで、「glassfish」は便宜上のものです)。そのすべての依存関係も同様に指定する必要があります。次に、次のコマンドを実行します。

grails refresh-dependencies

jar を Ivy キャッシュにコピーします。次に、アプリを実行します。jar が読み込まれます。

于 2013-01-16T10:04:12.193 に答える