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

标签 java maven osgi

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

我想要做的是设置一个 REST Web 服务;我发现this tutorial成为启动和运行一些基本功能的良好起点。所以我开始设置一个带有子项目的父项目(所有这些都来自 Maven OSGI Bundle 模板)。但在我开始将 bundle 部署到 Karaf 实例后,我开始努力解决 Karaf 中的“缺少需求”错误。我开始尝试列出 <Export-Package> 中的每个依赖项或<Embed-Dependency>但似乎我只是继续往下走,总是收到新的“缺少需求”消息,列出另一个依赖项。然后,我开始尝试使用 Maven 复制依赖项插件来导出项目中使用的任何依赖项,并将出现的任何内容复制到 Karaf 部署文件夹中。这在很大程度上是有效的,但我正在努力解决我认为的第 3 方 jar 的下游依赖关系,但这可能是一个单独的问题。

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

最佳答案

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

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

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

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

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

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

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

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

关于java - 在 Netbeans 和 Karaf 中开发 OSGI 包时如何管理依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24576188/

相关文章:

java - Spring MVC - POJO 中名称中带有连字符的查询参数

java - 如何配置OSGI声明性服务范围?

java - Spring Boot Actuate 实例化错误

java - 使用 TCP 将消息从 Java 发送到 Logstash

java - 从 2.10 升级时 Jackson 序列化失败(InvalidDefinitionException : Type id handling not implemented for type java. lang.Object)

java - 使用 poi-ooxml 破坏了资源提供

java - 处理 XML 时发生错误“无法从位置加载架构映射

java - 我什么时候应该使用 ejb 作为 JAR 的打包类型(或者什么时候 JAR 是 EJB 模块)?

java - 表示复杂配置的 OSGI 元类型

java - Web 的模块化 OSGI Java 框架?