我使用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()
方法打印的內容。
基本上,我想要一個包,由Karaf加載,並在駱駝定時器上激活以定期調用函數。 – Pete
那麼'Hello'接口的作用是什麼?這是否定義了應該定期調用的函數?我不熟悉Camel,但是你不需要使用Camel定義的接口來實現定時器功能嗎? –
請注意,blueprint定義提供的OSGi服務不會連接到同一個bundle中定義的依賴項,因爲這確保您在內部將它們引用爲bean。 –