代码之家  ›  专栏  ›  技术社区  ›  javamonkey79

包装jar的OSGi服务

  •  0
  • javamonkey79  · 技术社区  · 15 年前

    我正在尝试创建一个OSGi服务来包装另一个jar。我将jar添加到项目、类路径和二进制构建中。我在Activator中注册了该服务,但是当消费包调用该服务时,我在包装器jar上得到了java.lang.NoClassDefFoundError。有人知道我做错了什么吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Robin    15 年前

    您是否正在导出使用者所需的包以及实现所需的所有包。消费者将需要导入将被引用的所有内容。

    作为补充说明,在Eclipse for development中,以这种方式创建捆绑包不太好(在运行时也很好)。如果您试图从另一个OSGi项目引用jar中的类或接口,IDE将无法解析任何内容,因为它无法“看到”jar中的文件。jar必须在bundle中进行扩展,以使所有内容都可见(在IDE中)。出于构建目的,Eclipse基于导入和导出自动创建适当的类路径引用。如果捆绑包中没有jar文件,则必须显式维护此类路径。

        2
  •  1
  •   Mirko Jahn    15 年前

    你的行为可能有多种原因。为了确保这一点,我将检查以下内容:

    • 假设您使用Eclipse,请检查是否在清单编辑器的“Build”选项卡中包含了jar,以及是否在“Classpath”下的“Runtime”选项卡中指向了这个jar。

    • 创建的包:它是否包含jar?它是否有指向jar的“Bundle ClassPath”头,比如:“Bundle ClassPath:lib/myLibrary.jar,。”(最后一个.需要包含来自Bundle根目录的类-您的activator f.i.)

    • 确保jar实际上包含所有必需的依赖项,或者通过包装包中的导入包头来表达它们。Eclipse有一个“导入向导”来实现这一点。顺便说一下,前面提到的bnd工具也做了同样的事情。希望这有助于。。。

        3
  •  0
  •   John Doe John Doe    15 年前

    您是否在清单中使用了Bundle类路径?你为什么不使用 bnd 对于现有的jar?