OSGI 无法使用 javax.ws.rs 启动包 'missing requirement'

OSGI failed to start bundle 'missing requirement' using javax.ws.rs

我一直在尝试制作一个 OSGI REST 包。我已经将它分解为一个人为的最小化示例,其中包含一个带有单个 class 的捆绑工作区,该工作区使用了一些注释。当我通过 Eclipse 运行 包时,我在解析 javax.ws.rs 包时遇到错误。我已将 javax.ws.rs-api 2.0.1 添加到 cnf 项目并将 javax.ws.rs-api-2.0.1.jar 添加到我的构建路径捆。

当我 运行 包时,出现以下错误:

! could not resolve the bundles: [myprovider-1.0.0.201704280130 org.osgi.framework.BundleException: Unable to resolve myprovider [1](R 1.0): missing requirement [myprovider [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=javax.ws.rs)(version>=2.0.0)(!(version>=3.0.0))) Unresolved requirements: [[myprovider [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=javax.ws.rs)(version>=2.0.0)(!(version>=3.0.0)))] ] ! Failed to start bundle myprovider-1.0.0.201704280130, exception Unable to resolve myprovider [1](R 1.0): missing requirement [myprovider [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=javax.ws.rs)(version>=2.0.0)(!(version>=3.0.0))) Unresolved requirements: [[myprovider [1](R 1.0)] osgi.wiring.package; (&(osgi.wiring.package=javax.ws.rs)(version>=2.0.0)(!(version>=3.0.0)))]

我的捆绑包的 bnd.bnd 是:

-buildpath: \
    javax.ws.rs-api;version=2.0,\
    osgi.cmpn,\
    osgi.core
-runrequires: \
osgi.identity; filter:='(osgi.identity=org.apache.felix.gogo.command)',\
osgi.identity; filter:='(osgi.identity=org.apache.felix.gogo.runtime)',\
osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)'
-runfw: org.apache.felix.framework;version='[5.4.0,5.4.0]'
-runee: JavaSE-1.8
Export-Package: myprovider

我原来想做的和这个问题几乎一样:

但是,我的 bnd 文件中已有该问题的解决方案。

您应该将 bnd.bnd 文件分成两个文件。

  1. bnd.bnd 定义构建单个包的规则。所以构建路径以及像 Import-Packages 这样的调整设置都属于那里。

  2. app.bndrun 或类似的。您至少需要定义一个索引并在那里运行需求。 runrequires 应该包括你的用户包。

为了使您的包至少解析您还需要将 jaxrs api 包添加到您的索引。但这还不够。您还需要一个 jaxrs 实现,您还需要发布您的休息服务。有一些方法可以实现这一目标。其中一个是CXF-DOSGi.

有一个 REST example 使用 bnd 构建包。

还有an index and a bndrun file。即使在 soap 示例中,bndrun 也包含其余示例。