使用另一个OSGi包中的类

时间:2015-01-21 10:43:55

标签: java export osgi bundle

我在OSGi捆绑包中遇到了一个奇怪的问题。

我有两个捆绑,让我们说B1B2B1使用方法导出包含类名a.b.c的包Foo

public JsonNode helloWorld() {
    System.out.println("Hello World!");
    return null;
}

然后B2导入B1包并尝试使用Foo中的课程B1。我在编译时没有问题,在Felix中启动捆绑包时,一切似乎都能正常工作。

但是当B2被调用以使用helloWorld方法时,B2停止工作并且不会抛出任何错误! 经过一些调试后,我认为方法helloWorld的返回类型是原因,如果我将JsonNode更改为String,一切都按预期工作。

为什么我的felix控制台出现错误?当返回类型为JsonNode时,为什么我不能调用helloWorld方法?

感谢您的帮助!

Edit1:更多信息,以下方法执行完全相同的错误:

 public String helloWorld() {
     System.out.println("Hello World!");
     JsonNode test =  JsonNodeFactory.instance.objectNode();
     return test.asText();
 }

我在控制台中看到Hello World!没有,没有错误,没有痕迹,就像程序选择停在这里等待!

EDIT2: 建筑时我有这个警告,我不知道它是否重要:

[WARNING] Bundle fr.aaa.ccc.bbbb:1.0.0 : Export javax.json,  has 1,  private references [javax.json.stream], 

<击> 警告删除,仍然有相同的comportement。

EDIT3: 我设法在我的控制台中出错,我想我已经关闭以找出问题所在!!! /

Caused by: java.lang.LinkageError: 
loader constraint violation: 
when resolving interface method "a.b.c.FooInterface.welcome(Ljava/lang/String;)Lorg/codehaus/jackson/JsonNode;"
the class loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) 
of the current class, d/e/f/lasthope/Activator, 
and the class loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) for the method's defining class, a/b/c/aa/bb/FooInterface,
have different Class objects for the type org/codehaus/jackson/JsonNode used in the signature
    at d.e.f.Activator.start(Activator.java:37)

1 个答案:

答案 0 :(得分:0)

我猜你在BundleActivator中调用该方法。一个常见问题是例如例外情况。不记录start方法。因此,尝试使用try catch来调用helloworld并打印或记录异常。

我认为JsonNode的问题是bundle B2看不到类或B1看到不同的类。确保两个包都导入JsonNode所在的包。