AEM/Sling - 如何在独立代码中创建 ResourceResolverFactory?

AEM/Sling - How to create ResourceResolverFactory in a standalone code?

我正在尝试编写一些独立代码而不是 OSGi 包来学习和尝试 AEM 中的东西。在 OSGi 包中,我可以获得带有 @Reference 注释的 ResourceResolverFactory

我想知道如何在我的独立代码中获得它。我需要这个工厂来获得 ResourceResolver。我不确定这在独立代码中是否有可能。

实际上同样的问题适用于另一家工厂,PageManagerFactory

谢谢 - 阿图尔

如果您正在寻找 JSP 级别的代码片段,下面的代码片段将创建一个调用此 jsp 的页面版本。希望这有帮助。

<%@include file="/libs/foundation/global.jsp"%>
<%@page import="org.apache.sling.api.resource.Resource,
org.apache.sling.api.resource.ResourceResolver"%>
<% 
PageManager mypageManagerobj = resourceResolver.adaptTo(PageManager.class);
Page p= currentPage.getParent(0);
// below line will trigger a version creation process for the current page.
mypageManagerobj.createRevision(p);
%>

我认为这是不可能的,因为 ResourceResolverFactory 是由 OSGi 提供支持的 Apache Sling 的一部分。

也就是说,您应该能够使用用于单元测试的 SlingMocks 库。这将允许您从 JSON 文件加载一些示例内容并在 in-memory 存储库上执行操作。

仅供参考:独立 java 程序倾向于使用 JCR API 与 AEM 存储库交互。

正如其他人所提到的,这是不可能的。 ResourceResolverFactory@ProviderType 属性修饰。看 ResourceResolverFactory Documentation。该属性使 OSGi 框架的实现非常特殊。

要在 AEM 中尝试一些东西,从 AEM Documentation 的 AEM 样板项目开始会更容易。 OSGi 和 Sling 级别太低,它们唯一的 real-word 值(在 AEM 上下文中)位于 servlet 和组件模型绑定中。

作为参考,大多数独立的 Apache Oak 实用程序实现不使用 ResourceResolver,而是使用 类 的具体参考(因此强加了严格的版本兼容性要求)。

HTH

在 OSGi 环境之外引用 OSGi 服务

那根本不可能。您需要 OSGi 运行时才能使用 OSGi 服务,句号。

在独立的 Java 应用程序中,从技术上讲,您可以在 Java 程序的 main 方法中启动框架。查看 Apache Felix docs 以了解操作方法。但老实说,如果您使用的是 AEM,我看不出这样做有什么意义。这只会让你的事情变得更复杂。无论如何,您都需要捆绑包,并且您首先要重新发明 AEM 已经为您做的事情。

现在,如果您想做的是快速试验一些代码而无需创建 OSGi 包的开销,这里有几个我知道的简单方法:

在 AEM 中试验代码

无需创建 full-blown 项目即可快速编写代码并在 AEM 中对其进行测试的几种方法。

AEM Groovy 控制台

这是一个开源工具,允许您在 AEM 实例上执行 Groovy 代码。它使您可以访问 Sling 和 JCR API,还允许您与 OSGi 服务进行交互。

它很容易使用,只需安装它,打开控制台页面,输入您的脚本并执行它。

它为许多常用对象提供开箱即用的绑定,例如 resourceResolversessionpageManagerqueryBuilderslingRequest 等等。

它还提供了许多使 Sling 和 JCR API 更易于使用的便捷方法,以及一个非常简单的实用程序,可让您获取对 OSGi 服务的引用。

您询问了 ResourceResolverFactory,这里是您如何在脚本中获得一个:

def resourceResolverFactory = getService("org.apache.sling.api.resource.ResourceResolverFactory")

控制台甚至可以为您生成这段代码,它有一个很好的自动完成功能:

查看 the project on GitHub 以了解更多信息。

请注意,控制台本身使用了一堆 OSGi 包,因此代码实际上并不是独立的,因为它不是独立于 OSGi 环境而存在的。但是,用户不需要创建包并部署它们只是为了试验代码。

AEM HTL REPL

您可能想要查看的另一个项目是 AEM HTL REPL。我没有使用过它,但我知道它允许您通过编写 server-side JavaScript.

来使用 WCM Use APIs

使用 CRXDE

这基本上就是 的建议。创建新组件或修改现有组件。

使用 JSP 小脚本或 Java 脚本利用 WCM 使用 API。您可以在 CRXDE 中执行此操作或使用实际的 IDE 编写代码和 Vault tool to upload it to AEM. There are nice plugins for IntelliJ and Eclipse 使其更容易一些。

您无法在 OSGI 环境上下文之外解析和实例化 ResourceResolverFactory 等 OSGI 服务 运行 代码。但是你可以做的是,如果你想在那里测试一些东西,访问存储库并读取一些节点(例如数据)。为此,您可以使用以下代码创建 javax.jcr.Session:

import javax.jcr.Credentials; 
import javax.jcr.Repository; 
import javax.jcr.Session; 
import javax.jcr.SimpleCredentials;
org.apache.jackrabbit.commons.JcrUtils;

...

String repoUri = "repo uri", user = "admin", password = "admin";
Repository repository = JcrUtils.getRepository(repoUri);
Credentials creds = new SimpleCredentials(user, password.toCharArray());
Session session = repository.login(creds);