在 Netbeans 和 Karaf 中开发 OSGI 包时如何管理依赖关系?

Posted

技术标签:

【中文标题】在 Netbeans 和 Karaf 中开发 OSGI 包时如何管理依赖关系?【英文标题】:How to manage dependencies when developing OSGI bundle in Netbeans and Karaf? 【发布时间】:2014-08-25 21:42:47 【问题描述】:

我正在努力开发 OSGI 捆绑包以发布到 Karaf。创建新项目时,我使用的是 Netbeans 7.4 和 Create Maven OSGI bundle。我认为我正在努力处理不同项目之间的依赖关系,并在 Netbeans 中使用它们,然后发布到 Karaf。

我要做的是设置一个 REST Web 服务;我发现this tutorial 是一个很好的起点,可以让一些基本的东西开始运行。所以我开始建立一个带有子项目的父项目(所有这些都来自 Maven OSGI Bundle 模板)。但是在我开始将捆绑包部署到我的 Karaf 实例之后,我开始与 Karaf 中的“缺少要求”错误作斗争。我会开始尝试在<Export-Package><Embed-Dependency> 中列出每个依赖项,但似乎我只是继续往下走,总是收到新的“缺少要求”消息列出另一个依赖项。然后我开始尝试使用 maven copy-dependencies 插件来导出项目中使用的任何依赖项,并将出现的任何内容复制到 Karaf 部署文件夹中。这在大多数情况下都有效,但我正在努力解决我认为是 3rd 方 jar 的下游依赖项,但这可能是一个单独的问题。

那么,我想知道我应该如何使用这种设置开发一个连贯的“应用程序”?我知道我应该将所有内容分成独立的捆绑包;即,我将 REST 接口作为一个,实现作为另一个,业务逻辑作为另一个。作为一个 maven 项目,如果我对日期时间处理或字符串实用程序有依赖关系,maven 将处理所有这些问题。但是这些依赖项不会自动包含在我的 OSGI 包中,是这样吗?确保我的项目所依赖的所有内容都可用于 Karaf 中的捆绑包的工作流程是什么?我的项目有其他项目作为依赖项(即接口实现)呢?我会将该项目作为依赖项包含在内,以便它可以编译,但我如何确保在发布后满足该依赖项?

【问题讨论】:

【参考方案1】:

在使用 OSGi 时,编译时和部署时依赖项之间的不匹配确实是一个问题。

您需要了解的是它们之间的关系。在编译时,您拥有 Maven 依赖项。当您构建项目时,maven 捆绑插件会为您创建必要的 Import-Package 和 Export-Package 语句。大多数情况下,这很简单,您应该避免手动调整太多。

因此,在构建之后,Manifest 会指定生成的捆绑包需要什么,但这并不能自动确保满足依赖关系。因此,当您将捆绑包部署到 karaf 时,您会收到有关缺少依赖项的错误。这是正常的。

现在您需要安装满足这些依赖关系的其他包。通常,您可以简单地安装 maven 依赖项的 jar(如果它们是捆绑包)。但是,这并不总是有效。所以基本上你安装捆绑包并检查现在是否满足要求。

karaf 的好处是许多更大的依赖项(如 cxf)已经可以作为特性使用。因此,最好先尝试通过安装可用功能来获取依赖项,然后再尝试逐个捆绑安装它们。

因此,这可以帮助您正确获取依赖项。然后对于“生产”,最好的解决方案是创建您自己的功能文件,您可以在其中引用您找到的捆绑包。

虽然使用 deploy dir 安装包一开始看起来不错,但这并不是一个好的解决方案。最好使用 karaf 提供的 mvn: url 语法直接从 maven 安装包。

关于嵌入依赖项。有时这是一个很好的解决方案,但通常只会让事情变得更糟,因为它可能导致难以解决的包使用冲突。所以如果可能的话最好不要嵌入任何东西。

【讨论】:

谢谢,这很有帮助!我认为我的部分问题是我的一个捆绑包依赖于我无法在 Karaf 中使用的第 3 方 jar。我认为这抛弃了其他一些试图使用它的包。现在对我来说更有意义了,但我可能会针对该问题提出一个新问题。还有一个 - 在 Karaf / OSGI 中,配置变量是如何处理的?即,针对开发人员进行开发,然后将服务指向生产层?通常我会使用某种参数或配置文件,但这在这里是如何工作的? 在 OSGi 中,通常最好使用配置管理服务来处理配置。在 karaf 中,这被映射到 etc 目录中的配置文件。我已经写了一个关于这个的教程:liquid-reality.de/x/G4Be 谢谢!我浏览了示例,并设置了蓝图设置和 .cfg 文件。我的设置在 Karaf 控制台中可用,我可以修改它,但更改似乎没有反映在我的捆绑应用程序中。至少 refresh() 方法似乎永远不会被解雇。从代码中读取配置值是否有技巧?如果我使用蓝图进行配置,是否需要纯 OSGI 布线 (ConfigUpdater)? 如果你使用蓝图然后尝试使用配置管理命名空间。它在同一个教程中有所描述。

以上是关于在 Netbeans 和 Karaf 中开发 OSGI 包时如何管理依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

在 karaf 中启动包时出错:“通过两个依赖链”

关于Karaf Container 4.0.7

<ProjectName.ProjectUI 作为我的 Netbeans java OS X 应用程序的名称很烂

Karaf基础知识

Mac OS X 10.7.5 上的 NetBeans 7.3.1 找不到源文件夹(使用现有源打开项目)

Apache Karaf 与 Servicemix