未解决的要求:导入包:bndtools / osgi中的org.apache.commons.codec.language

时间:2018-11-08 17:10:29

标签: java osgi bnd bndtools

我目前在一个项目中,需要将PDE样式的插件转移到bnd样式的插件。 我遇到了外部jar的问题,因此我为每个jar建立了捆绑包,并将其包含在构建路径中。对于大多数广口瓶来说,这都可以正常工作,但是我得到了一个表现不如预期的瓶子。

org.apache.commons.codec.language。该软件包来自jar org.apache.commons.codec,它可以很好地解析(至少对于bndtools而言),但是当我运行捆绑包时,出现以下错误:

! could not resolve the bundles: [test-0.0.0 org.osgi.framework.BundleException: Could not resolve module: test [1]
  Unresolved requirement: Import-Package: org.apache.commons.codec.language; version="[1.9.0,2.0.0)"

]
! Failed to start bundle test-0.0.0, exception Could not resolve module: test [1]
  Unresolved requirement: Import-Package: org.apache.commons.codec.language; version="[1.9.0,2.0.0)"

org.osgi.framework.BundleException: Could not resolve module: test [1]
  Unresolved requirement: Import-Package: org.apache.commons.codec.language; version="[1.9.0,2.0.0)"

    at org.eclipse.osgi.container.Module.start(Module.java:447)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.start(EquinoxBundle.java:431)
    at aQute.launcher.Launcher.startBundles(Launcher.java:519)
    at aQute.launcher.Launcher.activate(Launcher.java:425)
    at aQute.launcher.Launcher.run(Launcher.java:303)
    at aQute.launcher.Launcher.main(Launcher.java:149)

在此github存储库中,我提取了一个会产生错误的参考:https://github.com/MaPhil/osgi-externals-test

我在这个主题上搜索了很多,但是最多的答案似乎是关于liferay或其他特定的库。希望任何人都能给我提示。

1 个答案:

答案 0 :(得分:3)

一些好消息开始于:

 Unresolved requirement: Import-Package: org.apache.commons.codec.language; version="[1.9.0,2.0.0)"

这表明您的OSGi捆绑软件具有org.apache.commons.codec.language的导入,并且它的版本范围(1.9到但不包括2.0)说明了您的构建路径未完全混乱上。

查看您的示例工作区,我看到您有一个用于包装Apache Commons Codec库的项目。对于您为什么要这样做,我有些困惑,因为Apache Commons Codec已经作为OSGi捆绑包在本地可用。如果要在工作空间中依赖它,则只需将其添加到现有存储库之一中即可。例如,在/cnf/central.maven中,您可以添加:

commons-codec:commons-codec:1.9

参考Maven Central的正式版本。然后,您可以使用以下方法在bnd文件的构建路径中引用该捆绑软件:

-buildpath: org.apache.commons.codec

要运行您的应用程序,您应该真正创建一个bndrun文件,您可以使用该文件来声明您的要求(在这种情况下,这是您对测试项目的要求),然后使用Resolve操作(一个Bndtools中的按钮或Gradle任务)。这将获取您的-runrequirements列表并创建-runbundles的列表。最终看起来像这样:

-runrequirements: osgi.identity;filter:='(osgi.identity=test)'

-runfw: org.eclipse.osgi;version='[3.13.100.v20180827-1536,3.13.100.v20180827-1536]'

-runbundles: test;version="[0.0.0,0.0.1)",\
     org.apache.commons.codec;version="[1.9.0,1.9.1)"

然后可以直接从该bndrun文件运行。它将启动框架并为您部署所有运行包。如果您使用的是Bndtools,那么它甚至可以使已部署的捆绑软件与Eclipse Workspace保持同步,从而使您始终可以部署最新的代码。

您可以查看有关如何进行此类操作的更多信息in the Bndtools documentation或相关详细信息in OSGi enRoute