我在OSGi捆绑包中遇到了一个奇怪的问题。
我有两个捆绑,让我们说B1
和B2
。
B1
使用方法导出包含类名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)
答案 0 :(得分:0)
我猜你在BundleActivator中调用该方法。一个常见问题是例如例外情况。不记录start方法。因此,尝试使用try catch来调用helloworld并打印或记录异常。
我认为JsonNode的问题是bundle B2看不到类或B1看到不同的类。确保两个包都导入JsonNode所在的包。