我刚刚开始 Apache sling 和 CQ5 开发。在 Sling 中有使用 OSGI 包的概念。
我无法了解 sling 框架实际上如何与这些 bundle 交互以及来自 bundle 的响应去向何处?
最佳答案
OSGi是Sling和CQ5产品使用的模块框架和服务平台。 Sling 本身由一系列托管在 Felix OSGi 容器中的包组成。 Bundle 是由容器管理的组件/服务和 java 类的集合组。 bundle 可以指定将导入、导出哪些包以及这些依赖项的版本。
您可以通过多种方式与 Sling 中的 OSGi 进行交互。从 JSP/JSP 中,您可以使用 sling 对象(类型为 SlingScriptHelper ),如果您包含以下行,它很可能在您的 JSP 页面中可用:
<%@include file="/libs/foundation/global.jsp"%>
在您的组件中或具有以下内容:
<cq:defineObjects>
你可以这样使用它:
QueryBuilder queryBuilder = sling.getService(QueryBuilder.class);
此外,如果您有自己的 OSGi 组件(例如 Servlet、服务等),您可以使用 SCR 注释注入(inject)对其他 OSGI 组件/服务的引用。 Bertrand 在他对 Getting OSGi services from a bundle in Sling/CQ 的回答中描述了这一点.实际上,这意味着将 @Reference 注释添加到组件中的 OSGI 组件变量,如下所示:
@Reference
private SlingRepository repository;
当您的组件加载时,引用将由 OSGi 容器注入(inject)。
bundle 没有这样的响应。部署的包应该在系统控制台中可见:
http://localhost:4502/system/console/bundles
在此处声明其组件、服务和配置:
http://localhost:4502/system/console/services
http://localhost:4502/system/console/components
http://localhost:4502/system/console/configMgr
(将localhost:4502替换成你自己的CQ服务器host:port)
一旦您获得了一个组件的引用,您就可以调用该组件的方法并使用这些调用的返回值。
关于java - sling 如何使用 osgi 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14619410/