如何OSGIfy图书馆

时间:2012-10-25 20:56:29

标签: maven osgi apache-camel bnd

我正在开发一个项目,它是集成项目,我们正在使用Apache Camel和Apache Karaf。 在项目中,我需要使用Jira REST Java client library.

所以我已经阅读了很多关于如何将非OSGI库包装到OSGI包中的各种文章和线程,但我真的不确定我是否做对了。

所以,我创建了一个POM文件,它依赖于所需的库。制作了一个包,并试图将它部署到卡拉夫,当然,卡拉夫抱怨丢失包裹。

所以,我发现了相应的maven依赖,添加了它,package进入<Import-Package>,依赖进入<Embed-Dependency>

另一轮,部署,找到依赖关系,添加,......再一次,直到Karaf对这个包很好。

这是真的正确吗?在我看来,它似乎很疯狂,所以我想我不会得到它通常:)

最后,包裹变得稳定在我的工作计算机上,我快速检查并回家,我继续但是,奇怪的是,在我的个人计算机上编译的相同的POM /包不工作,再次抱怨缺少包,但这一次,这个包肯定在POM文件中,并且肯定它被嵌入包中,我可以在那里看到它。

这次丢失的包是org.apache.commons.codec。

org.osgi.framework.BundleException: Unresolved constraint in bundle jiraclient.bundle [134]: Unable to     resolve 134.0: missing requirement [134.0] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.codec)
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1247)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1219)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1208)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:503)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)[6:org.apache.felix.fileinstall:3.2.6]

所以,现在我完全糊涂了,出了什么问题:(

非常好,伙计们,帮助我。谢谢!

POM文件很长,所以我猜链接更好:http://pastebin.com/j5cmWveG

1 个答案:

答案 0 :(得分:9)

是的,就部署模式而言,OSGi恕我直言“远非易用”,要求在MANIFEST.MF文件中100%捆绑osgi元数据。你需要一个数学博士来理解BND工具。不幸的是,许多JAR不是OSGi捆绑包。

查看包含所有导入|导出的pom.xml文件以及“不易理解”的语法,任何普通工程师都需要花费5秒才能理解这个“在丹麦的状态“;例如OSGi!=我们生活的世界。这必须而且应该更容易恕我直言。

您可以使用 wrap url处理程序在Karaf中安装普通JAR: http://karaf.apache.org/manual/latest/developers-guide/creating-bundles.html

另一个技巧是创建一个 uber JAR ,例如将它全部放在一个JAR文件中然后你可以部署它。

还有 FAB (Fuse Bundles),它使OSGi部署更容易,因为它在部署时为您处理大部分这种疯狂,而不是您必须处理OSGi MANIFEST.MF疯狂:http://www.davsclaus.com/2012/08/osgi-deployment-made-easy-with-fab.html