2012-03-15 10 views
4

プロジェクトでPOCを実行しています。ここでは、SOAPベースのリクエストを送信し、それに応じてWebサービスからSOAP応答を取得します。 Springのフレームワークが提供するwebservicesテンプレート(クライアントサイドAPI)をアプリケーションで活用することを目指しています。私たちのアーキテクチャーによれば、OSGI準拠のバンドル(WebサービステンプレートAPIを使用してWebサービスとやり取りするコード用)を作成し、それをApache Felixコンテナにデプロイします。 Felixコンテナにすべての従属OSGI準拠バンドルをインストールして、すべての依存関係を解決しました。OSGIフレームワークでランタイムにJavaクラスを動的にロードする方法は?

webservicesテンプレートごとに、デフォルトのWebサービスメッセージ送信者は、クラスローダーによって実行時に動的にロードされるHttpUrlConnectionMessageSenderです。 Felixコンテナは、依存OSGIバンドル(WebサービスバンドルにはHttpUrlConnectionMessageSenderが含まれています)からクラスを読み込むことができないため、以下の例外が発生しています。以下の例外ログを参照してください。

* org.springframework.beans.factory.BeanInitializationException: Could not find default strategy class for interface [org.springframework.ws.transport.WebServiceMessageSender]; nested exception is java.lang.ClassNotFoundException:org.springframework.ws.transport.http.HttpUrlConnectionMessageSender at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:126) 

    at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:90) 

    at org.springframework.ws.client.core.WebServiceTemplate.initMessageSenders(WebServiceTemplate.java:320) 

    at org.springframework.ws.client.core.WebServiceTemplate.initDefaultStrategies(WebServiceTemplate.java:306) 

    at org.springframework.ws.client.core.WebServiceTemplate.<init>(WebServiceTemplate.java:143) 

    at test.soapservice.service.SOAPServiceImpl.<init>(SOAPServiceImpl.java:40) 

    at test.soapservice.service.SOAPServiceActivator.start(SOAPServiceActivator.java:17) 

    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641) 

    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977) 

    at org.apache.felix.framework.Felix.startBundle(Felix.java:1895) 

    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944) 

    at org.apache.felix.gogo.command.Basic.start(Basic.java:729) 
によって引き起こさ

:java.lang.ClassNotFoundExceptionが:私の理解あたりとしてorg.springframework.ws.transport.http.HttpUrlConnectionMessageSender

at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 

    at java.security.AccessController.doPrivileged(Native Method) 

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) 

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 

    at org.springframework.util.ClassUtils.forName(ClassUtils.java:211) 

    at org.springframework.util.ClassUtils.forName(ClassUtils.java:164) 

    at org.springframework.ws.support.DefaultStrategiesHelper.getDefaultStrategies(DefaultStrategiesHelper.java:114) 

、フェリックス・コンテナは、動的にClassUtilsを使用してクラスをロードすることができません.forName()は別のバンドルに存在します。これは、現在のバンドルが依存バンドルのクラスローダーとは異なるクラスローダーを持つコラボレーションの問題として認識されます。

このコミュニティのユーザーに同じ例外が発生しましたか? 「はい」の場合は、実行時クラスの依存関係を解決するために必要なステップは何ですか?上記の問題を解決するためにあなたの考え/指針を共有してください。迅速な対応が高く評価され、私たちのPOCを成功させるのに役立つかもしれません。事前に

おかげで、Class.forName()の形で Mridulチョプラ

+0

あなたは間違いなくマニフェストに 'org.springframework.ws.transport.http'を追加しましたか? – artbristol

+0

クラスを名前でロードすることはまったく問題ではありません。バイトコード検査ツール(bnd)を使用してマニフェストを生成することはできません。 artbristolのように、マニフェストをカスタマイズし、 'org.springframework.ws.transport.http'をインポートする必要があります。あなたの目録を見せることができますか? –

答えて

0

クラスローディングはどんなのOSGiコンテナ内の問題ではありません。ここでの問題は、MANIFEST.MFファイルに正しいインポート宣言が含まれていないことです。 1つのバンドルはorg.springframework.ws.transportパッケージをエクスポートし、バンドルは同じパッケージをインポートする必要があります。

Mavenを使用してバンドルを構築する場合は、Felix Bundle Pluginを使用して正しいマニフェスト情報を生成できます。

<plugins> 
    <plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
     <Private-Package>my.private.package.*</Private-Package> 
     </instructions> 
    </configuration> 
    </plugin> 
</plugins> 

これはあなたのコードを検査し、あなたの「プライベート」パッケージのスコープ内ではありません何のために輸入を追加する必要があります。この作業を行うために行うべきもう1つの作業は、bundlepackagingタイプを設定することです。

<packaging>bundle</packaging> 

ただし、上記の例は、ビルドツールとしてMavenを使用している場合の例です。 Gradleを使用している場合は、Gradle OSGi pluginを使用してマニフェストを作成できます。また、Antを使用している場合は、SpringSource Bundlor project(btw、Mavenプラグインもあります)を使用できます。

+0

実際にClass.forName()を使用することは、OSGiではお勧めできません。私は、OPが、OSGiのようなOSGiについての良い本を、http://www.amazon.com/OSGi-Action-Creating-Modular-Applications/dp/1933988916 – lothar

関連する問題