Apache Karaf 和 OSGI 捆绑包

Posted

技术标签:

【中文标题】Apache Karaf 和 OSGI 捆绑包【英文标题】:Apache Karaf and OSGI Bundles 【发布时间】:2015-05-22 02:47:33 【问题描述】:

在 Apache Karaf 上搜索了很多之后,我了解到它用于测试和构建 OSGI 包。我还没有弄清楚如何使用 Apache Karaf 以及如何使用它 我也不太了解对 OSGI 捆绑包的需求。

此外,我还想知道以下疑问的答案:

    简单来说,Apache karaf 到底是什么? 解决什么目的?可以用来解决日常 算法问题? 我在哪里可以找到关于 Karaf 的不错的教程问题,从哪里开始 Apache Karaf、Apache Felix 和 Apache 有什么区别 Maven 以及它们与 OSGI 有什么关系?

【问题讨论】:

【参考方案1】:
    Apache Karaf 是一个 OSGi 容器,它提供了运行 OSGi 捆绑包的基础设施(标准 Jar 与 OSGi 清单),因为 Tomcat 是一个 Web 容器,提供了运行 Web 应用程序的基础设施。 不了解您的日常算法问题,但由于其 OSGi 特性,它解决了许多其他日常问题。为此,您最好看一下 OSGi 及其内容。简而言之: OSGi 可以帮助您解决两个主要问题,即高内聚和低耦合。 由于类加载器分离(它是图而不是树),可以运行同一工件的多个版本。 由于服务注册表的存在,可以有一个类似于架构的插件,其中一个应用程序可以侦听一个接口(服务)的多个实现 周围有很多,甚至是让您入门的书籍,您只需在 Google 上搜索即可。或者看看 Apache Karaf 文档和对应的Articles Apache maven:它是一个构建系统,用于管理构建时的依赖项。 Apache Felix:它是一个 OSGi 框架实现(如 Eclipse Equinox)。 Apache Karaf:正如 1. 一个 OSGi Container 中所说,解决了很多基础设施问题,例如:日志记录。易于部署,易于配置,等等。再次查看完整堆栈,请查看documentation

【讨论】:

【参考方案2】:

要了解 Apache Karaf,首先应该了解 OSGi。

Java 应用程序以 Jar 文件的形式部署为它们的工件。如果应用程序依赖于其他 jar 文件,那么这些 jar 文件必须存在于应用程序的类路径中。当应用程序运行时,所需的类会根据需要加载和实例化。

如果您的应用程序部署在任何容器内(例如:像 tomcat 这样的网络服务器),那么容器会遵循一些标准逻辑来加载或初始化您的应用程序。这涉及加载类。要求程序内部引用的类必须存在于应用程序的类路径中(例如:war 文件的 web-inf 目录)。 如果容器在 war 中没有找到所需的类,它会咨询应用程序的父类加载器来定位类文件。 因此,当使用普通的 java 运行时时,多个分层类加载器就会出现。 这有一个问题,即根据部署的应用程序多次加载同一个类。

欢迎来到 OSGi。 在 OSGi 中,jar 将被称为 Bundle。 一个包看起来像一个 jar,但在其 manifest.mf 文件中有额外的标头。 标头提供有关捆绑导出/导入哪些包的信息。 当您的应用程序想要使用任何库 jar 文件时,您会在 manidest 的 Import-package 标头中提及所需的包。当任何其他包想要使用您的包中的包时,您必须使用 Export-package 标头公开包。

OSGi 运行时会查找此类标头并有效地处理类加载。因此,一个类将仅使用其 jar 的类加载器加载一次,您将从烦人的 ClassNotFoundExceptions 中解救出来。

OSGi 是规范。它有一个可以在 manifest.mf 中使用的标头列表。期间。

Apache Felix 和 Eclipse equinox 是该规范的少数实现。

Apache Karaf 是一个控制台。控制台有助于与任何应用程序进行交互。在这里,应用程序是 OSGi 运行时,即 Apache Felix。 Karaf 提供了很多与 OSGi 交互的命令。您可以使用其热部署功能在运行时将新包部署到 OSGi(无需重新启动 Karaf)。只需将捆绑文件放在部署文件夹中即可。

使用 Karaf,您可以查看任何捆绑包公开的服务和包。 Karaf 提供了很多开箱即用的框架,例如 spring、jetty server、日志工具。

使用 Karaf,您可以在运行时启动、停止任何包。

因此,总而言之,Karaf 只是 OSGi 运行时的控制台。

您可以编写任何普通的 java 程序并使用 OSGi。您只需将应用程序初始化逻辑与捆绑激活器挂钩。

Apache maven 是一个构建工具。有了这个,您可以构建(准备 jar 工件)任何 java 项目。

在使用 OSGi 时,您需要遵守 manifest.mf 语义。应根据需要导出和导入包。为了帮助构建适当的 manifest.mf ,有一个“bnd”工具。该工具分析您的应用程序的类路径,并使用适当的清单准备最终的 OSGi 包。

Apache maven 将这个“bnd”工具与它的 maven-bundle-plugin 一起使用。 只需将此插件附加到项目的生命周期目标即可。 Maven 将为您准备一个捆绑包。

【讨论】:

以上是关于Apache Karaf 和 OSGI 捆绑包的主要内容,如果未能解决你的问题,请参考以下文章

Karaf - Kafka OSGI 捆绑包 - 生产者问题

OSGi:无法在 Apache Karaf 中找到 UserAdmin

jdo/OSGi:捆绑更新后构建 JDO PersistenceManagerFactory 时出错

高效的 OSGi 开发工作流程

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

OSGi 捆绑包未启动:缺少要求 osgi.wiring.package; > &(osgi.wiring.package=org.apache.felix.dm)