2016-07-26 20 views
0

私はcamel-archetype-blueprintのmavenのアーキタイプを使用してOSGiバンドルを作成しました。私はKarafにこれをインストールしようとしましたが、バンドルはGracePeriodに入っています。 diagを実行した後、jarファイル自体の内部に依存関係がありません。Karaf:自分のjarのクラスがありません

[OK]を、長いバージョン:

原型から生成されたjarファイルが原型から含まれていますこんにちは、HelloBeanクラスが含まれています:

$ jar tvf myproject-1.0-SNAPSHOT.jar 
    455 Tue Jul 26 11:25:10 UTC 2016 META-INF/MANIFEST.MF 
    0 Tue Jul 26 11:25:10 UTC 2016 META-INF/ 
    0 Tue Jul 26 11:25:10 UTC 2016 META-INF/maven/ 
    0 Tue Jul 26 11:25:10 UTC 2016 META-INF/maven/com.petewall/ 
    0 Tue Jul 26 11:25:10 UTC 2016 META-INF/maven/com.petewall/myproject/ 
    143 Tue Jul 26 11:25:10 UTC 2016 META-INF/maven/com.petewall/myproject/pom.properties 
    3418 Tue Jul 26 11:25:06 UTC 2016 META-INF/maven/com.petewall/myproject/pom.xml 
    0 Tue Jul 26 11:25:10 UTC 2016 OSGI-INF/ 
    0 Tue Jul 26 11:25:10 UTC 2016 OSGI-INF/blueprint/ 
    1376 Tue Jul 26 11:20:12 UTC 2016 OSGI-INF/blueprint/blueprint-bean.xml 
    961 Tue Jul 26 11:20:12 UTC 2016 OSGI-INF/blueprint/blueprint-service.xml 
    0 Tue Jul 26 11:25:10 UTC 2016 com/ 
    0 Tue Jul 26 11:25:10 UTC 2016 com/petewall/ 
    143 Tue Jul 26 11:24:56 UTC 2016 com/petewall/Hello.class 
    1022 Tue Jul 26 11:24:56 UTC 2016 com/petewall/HelloBean.class 
    676 Tue Jul 26 11:20:12 UTC 2016 log4j.properties 

私は、deployディレクトリにこのjarファイルをドロップ私のkarafインスタンスの。バンドルはインストールされ、bundle:listコマンドにリストされています。ただし、バンドルが起動するとGracePeriodに入ります。診断それは依存性が欠けていることを示しています。しかし、それらのクラスがさえkarafのexportsコマンドを使用して発見され

[email protected]()> bundle:diag 98 
Camel Blueprint Route (98) 
-------------------------- 
Status: GracePeriod 
Blueprint 
7/26/16 6:26 PM 
Missing dependencies: 
(objectClass=com.petewall.Hello) 

[email protected]()> exports 
Package Name      | Version  | ID | Bundle Name 
----------------------------------------------------------------------------- 
... 
com.petewall      | 1.0.0.SNAPSHOT | 98 | myproject 
... 

そしてclassesコマンド:

[email protected]()> classes 
... 
com/petewall/Hello.class 
com/petewall/HelloBean.class 

私はこれらの技術(Karaf、Camel、OSGiなど)のすべてに非常に新しいので、私は何かが欠けていると確信しています。どうか、誰かが私をここの正しい方向に向けることができますか?

UPDATE 1: archetypeは、青写真サービスとBeanを定義するように見える2つのXMLファイルを生成します。

青写真-bean.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="..." xmlns:xsi="..." xmlns:cm="..." xsi:schemaLocation="..."> 
    <cm:property-placeholder persistent-id="HelloBean" update-strategy="reload"> 
    <cm:default-properties> 
     <cm:property name="greeting" value="Hi from Camel" /> 
    </cm:default-properties> 
    </cm:property-placeholder> 

    <bean id="helloBean" class="com.petewall.HelloBean"> 
    <property name="say" value="${greeting}"/> 
    </bean> 

    <camelContext id="blueprint-bean-context" xmlns="http://camel.apache.org/schema/blueprint"> 
    <route id="timerToLog"> 
     <from uri="timer:foo?period=5000"/> 
     <setBody> 
     <method ref="helloBean" method="hello"/> 
     </setBody> 
     <log message="The message contains ${body}"/> 
     <to uri="mock:result"/> 
    </route> 
    </camelContext> 
</blueprint> 

青写真-service.xmlに:String hello()

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="..." xmlns:xsi="..." xmlns:cm="..." xsi:schemaLocation="..."> 
    <reference id="helloService" interface="com.petewall.Hello" /> 
    <camelContext id="blueprint-service-context" xmlns="http://camel.apache.org/schema/blueprint"> 
    <route id="timerToLog"> 
     <from uri="timer:foo?period=5000"/> 
     <setBody> 
     <method ref="helloService" method="hello"/> 
     </setBody> 
     <log message="The message contains ${body}"/> 
     <to uri="mock:result"/> 
    </route> 
    </camelContext> 
</blueprint> 

アーキタイプは、一つの方法を定義するインターフェイス、Helloを生成します。 HelloBeanクラスはそのインターフェイスを実装し、private String sayパラメータを使用してhello()メソッドの内容を変更します。

答えて

2

実際に欠落しているOSGiサービスは、「欠落している依存関係」として報告されています。

あなたがBlueprint XMLを投稿していないため、確信が持てませんが、エラーメッセージがこれを強く示唆しています。あなたはおそらく要素を持っていて、それはcom.petewall.Helloサービスを指しています。

いずれのバンドルもcom.petewall.Helloのインスタンスをサービスとして提供していますか?この名前のバンドルにクラスファイルが存在することは無関係であることに注意してください。おそらくあなたはこれを間違った方向に持ち、あなたのバンドルはサービスを提供しているはずですか?あなたは、あなたが何をしようとしているかについて、より高いレベルから少し説明することができますか?

+0

基本的に、私はKarafによって読み込まれたバンドルが必要で、ラクダのタイマーでアクティブにして定期的に関数を呼び出します。 – Pete

+0

したがって、 'Hello'インターフェースの役割は何ですか?これは定期的に呼び出されるべき機能を定義していますか?私はCamelに慣れていませんが、Camelで定義されたインターフェースを使ってタイマー機能を実装する必要はありませんか? –

+0

青写真の定義で提供されるOSGiサービスは、同じバンドルで定義された依存関係に結び付けられないため、内部的にそれらを豆として参照するようにしてください。 –

1

アーキタイプは、Beanに対してメソッドを呼び出す2つの異なるスタイルを作成したようです。

最初の青写真はHelloBeanをローカルで定義し、その上でメソッドを呼び出します。これは単独で実行することができます。しかし、OSGiサービスは公開されていません。

第2の青写真はOSGiサービスを参照し、その上でメソッドを呼び出します。このインターフェイスでサービスをエクスポートするバンドルをインストールしない限り、これを開始することはできません。

バンドルのすべての青写真のxmlがまとめて1つの青写真のコンテキストになります。したがって、結合された青写真のコンテキストは、実行時にHelloBeanサービスが存在する場合にのみ開始されます。

2番目のblueprint.xmlを省略すると、バンドルが正常に起動するはずです。

関連する問題