2016-07-26 71 views
0

我使用camel-archetype-blueprint maven原型創建了一個OSGi包。然後我試圖把它安裝到卡拉夫,但是捆綁正在進入GracePeriod。運行診斷之後,它缺少jar文件本身內的依賴項。Karaf:從我自己的jar中缺少類

好,長版本:

從原型生成的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 

我放棄了這個jar文件到deploy目錄我的karaf實例。該軟件包已安裝並在bundle:list命令中列出。但是,當捆綁包啓動時,它將進入GracePeriod。診斷它表明,它缺少的依賴關係:

[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 

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

然而,這些類是使用karaf的exports命令竟然發現所有這些技術都非常新穎(卡拉夫,駱駝,OSGi等),所以我相信我錯過了一些東西。請有人指點我在這裏的正確方向嗎?

UPDATE 1: 原型生成兩個XML文件,它們似乎定義了藍圖服務和bean。

藍圖-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中:

<?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,即定義了一個方法:String hello()HelloBean類實現該接口,並使用private String say參數更改hello()方法打印的內容。

回答

2

什麼藍圖報告的「缺失依賴」實際上是一個缺少的OSGi服務。

由於您尚未發佈Blueprint XML,所以很難確定,但錯誤消息強烈暗示了這一點。您可能在那裏有一個<reference>元素,它指的是com.petewall.Hello服務。

是否有任何包提供com.petewall.Hello作爲服務的實例?請注意,與您的名稱捆綁在一起的類文件是無關緊要的。也許你有這個錯誤的方式,你的包應該提供服務?你能從高層解釋一下你想做什麼嗎?

+0

基本上,我想要一個包,由Karaf加載,並在駱駝定時器上激活以定期調用函數。 – Pete

+0

那麼'Hello'接口的作用是什麼?這是否定義了應該定期調用的函數?我不熟悉Camel,但是你不需要使用Camel定義的接口來實現定時器功能嗎? –

+0

請注意,blueprint定義提供的OSGi服務不會連接到同一個bundle中定義的依賴項,因爲這確保您在內部將它們引用爲bean。 –

1

該原型似乎創建了兩種不同的調用Bean方法的方式。

第一個藍圖在本地定義了HelloBean並在其上調用了一個方法。這將能夠自行運行。它不會發布任何OSGi服務。

第二個藍圖引用一個OSGi服務並調用一個方法。這將無法啓動,除非您安裝一個使用該界面導出服務的軟件包。

一個捆綁包的所有藍圖xml都合併成一個藍圖上下文。因此,只有在運行時存在HelloBean服務時,合併的藍圖上下文才會啓動。

嘗試省略第二個blueprint.xml,並且您的包應該正常啓動。