我目前正在一个项目中工作,需要将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 repo中,我提取了一个产生错误的作为参考:https://github.com/MaPhil/osgi-externals-test
我在谷歌上搜索了很多关于这个话题的内容,但大多数答案似乎都是关于lifery或其他特定的图书馆。我希望你们中的任何人都能给我一个提示。
一些好消息可以从开始
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,但不包括2.0(很好地表明您的构建路径并没有完全混乱。
通过查看您的示例工作区,我发现您有一个项目,您正在使用该项目来封装ApacheCommons编解码器库。我有点困惑你为什么要这么做,因为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文件运行。它将启动框架并为您部署所有的runbundle。如果您使用Bndtools,它甚至会使部署的捆绑包与Eclipse工作区保持同步,这样您就可以始终部署最新的代码。
您可以在Bndtools文档中看到关于如何做这类事情的更多信息,或者在OSGienRoute中看到相关的详细信息