要了解 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 将为您准备一个捆绑包。