BndTools,如何添加非 OSGi JAR?使用普通 JAR 会破坏整个项目。缺少要求接线包
Posted
技术标签:
【中文标题】BndTools,如何添加非 OSGi JAR?使用普通 JAR 会破坏整个项目。缺少要求接线包【英文标题】:BndTools, How to add a non-OSGi JAR? Using plain JAR breaks the whole project. Missing requirement wiring package 【发布时间】:2018-05-17 20:16:04 【问题描述】:我正在开发这个基于 BndTools 的 OSGi 项目:https://github.com/Jafre13/ISS-Product
我的项目虽然需要一个非 OSGi 库 (aliasi-lingpipe - https://mvnrepository.com/artifact/de.julielab/aliasi-lingpipe/4.1.0)。
这就是问题的开始。首先,我尝试直接从 Maven 存储库添加 JAR,因为 BndTools 据说与 Maven 存储库兼容,但它似乎不适用于“存储库浏览器”。即使按照http://bnd.bndtools.org/plugins/maven.html 中的说明将 Maven Central 插件添加到 build.bnd 文件中,仍然会产生相同的结果。
放弃让 Maven 工作,我尝试以最简朴的方式完成它并自己下载 JAR 并将其添加为此处指定的纯 JAR:http://bndtools.org/faq.html(6 如何在构建时依赖纯 JAR 文件时间?)
这次 JAR 得到了识别,我可以开始在代码中使用它。但是一旦你启动 OSGi 框架,一切都会再次崩溃,因为它试图解析非 OSGi 类路径,从而导致如下连接错误:
无法解析捆绑包:[slf4j.api-1.7.25 org.osgi.framework.BundleException:无法解析 slf4j.api [6](R 6.0): 缺少需求 [slf4j.api [6](R 6.0)] osgi.wiring.package; (&(osgi.wiring.package=org.slf4j.impl)(version>=1.6.0)) 未解决 要求:[[slf4j.api [6](R 6.0)] osgi.wiring.package; (&(osgi.wiring.package=org.slf4j.impl)(version>=1.6.0))] , dk.sdu.sso.sred-0.0.0.201712041036 org.osgi.framework.BundleException: 无法解决 dk.sdu.sso.sred [7](R 7.0):缺少要求 [dk.sdu.sso.sred [7](R 7.0)] osgi.wiring.package; (osgi.wiring.package=com.aliasi.classify) 未解决的需求: [[dk.sdu.sso.sred [7](R 7.0)] osgi.wiring.package; (osgi.wiring.package=com.aliasi.classify)]]
所以在这一点上我完全被阻止并且无法继续。我希望有一些 OSGi 经验的人可以在这里提供帮助。
问候和感谢。
【问题讨论】:
【参考方案1】:通过在构建时添加 jar,您可以编译但不能运行。
在构建过程中,bnd 会看到您需要 jar 中的包并为其创建 Import-Package 语句。所以在这种状态下,您需要部署一个导出包的包。实际上,这意味着您必须从 jar 中创建一个包。
另一种选择是将 jar 嵌入到您自己的包中。这可以通过将您需要的包添加为私有包来完成。然后 Bnd 会自动嵌入这些。如果 jar 真的只在内部使用,这种方法效果很好。
【讨论】:
以上是关于BndTools,如何添加非 OSGi JAR?使用普通 JAR 会破坏整个项目。缺少要求接线包的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 bndtools 通过 Scala 创建 OSGi 包?
osgi (bndtools) 中的 Restlet 包无法启动。激活程序错误 com/sun/net/httpserver/HttpHandler
OSGi Felix 和 BndTools - 按名称加载类