2016-07-26 33 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,并且您的包应该正常启动。