2009-04-18 64 views
0

我想创建一个包装另一个罐子的OSGi服务。我将该jar添加到项目,类路径和二进制版本。我在Activator中注册了服务,但是当使用bundle打电话给服务时,我在包装jar上得到了一个java.lang.NoClassDefFoundError。有没有人有任何想法我在这里做错了?OSGi服务包装罐

在此先感谢。

回答

2

您是否正在导出消费者所需的软件包以及所有需要的软件包。消费者需要导入所有将被引用的东西。

作为一个方面说明,以这种方式创建捆绑包在Eclipse中不适用于开发(适用于运行时)。如果您尝试从另一个OSGi项目的jar中引用类或接口,IDE将无法解析任何内容,因为它无法“查看”jar中的文件。该jar必须在bundle中进行扩展才能看到所有内容(在IDE中)。 Eclipse会基于导入和导出自动创建适当的类路径引用以用于构建目的。如果没有包中的jar文件,你将不得不显式维护这个类路径。

+0

我之前使用过的OSGi捆绑包中的lib jar,而不是一个服务委托给他们。我想我现在得到它 - 非常感谢! – javamonkey79 2009-04-20 17:13:28

0

您是否在清单中使用了Bundle-Classpath?为什么不使用bnd作为现有的jar?

+0

是的,我正在使用Bundle-Classpath。我不使用bnd,因为这是一个演示应用程序 - 它更多的是教学而不是实际使用。我想知道为什么这个问题与刚才的问题相反。这是由于单独的类路径例如消费者无法看到提供者嵌入式lib jar吗?还有别的吗? – javamonkey79 2009-04-18 17:14:31

1

您的行为可能有多种原因。为了确保,我会检查以下内容:

  • 假设你使用Eclipse检查工作,如果你已列入清单编辑你的“生成”选项卡的罐子,以及指出,在这个非常罐子“Classpath”下的“Runtime”选项卡。

  • 创建的包:包含jar吗?它是否有指向jar的“Bundle-ClassPath”头文件,如:“Bundle-ClassPath:lib/myLibrary.jar ,.” (最后一个需要包含来自包的根目录的类 - 您的激活码fi)

  • 确保jar实际上包含所有必需的依赖项,或者通过包裹包中的Import-Package标头表示它们。 Eclipse有一个“导入向导”。前面提到的bnd工具也是这样做的。希望有所帮助...

+0

我并没有试图通过构建所有的方式,我只是从Eclipse运行。然而,当我将它打包时,lib jar就在捆绑包中,并在清单中: Bundle-ClassPath:。,lib/the_jar_that_is_failing.jar 我在捆绑包上运行了安装文件并更新了消费者jar。此时消费者的罐子没有启动。当我尝试并开始它时,我得到异常。 我知道BND,但我希望了解我做错了什么,而不是'只是修复它':) – javamonkey79 2009-04-18 17:08:41