我正在尝试编写一些独立的代码而不是OSGi包,用于在AEM中学习和尝试。在OSGi包中,我可以使用ResourceResolverFactory
注释获得@Reference
。
我想知道如何在我的独立代码中获得它。我需要这个工厂来获得ResourceResolver
。我不确定这是否是独立代码中的可能性。
实际上,同一问题适用于另一家工厂,PageManagerFactory
!
由于 - 阿图尔
答案 0 :(得分:3)
这根本不可能。您需要OSGi运行时才能使用OSGi服务,期间。
在独立的Java应用程序中,您可以从技术上在Java程序的main
方法中启动框架。查看Apache Felix docs以了解具体方法。但说实话,如果你和AEM合作,我不明白这样做的意义。这让你的事情变得更加复杂。无论如何你都需要捆绑包,你首先要重塑AEM已经为你做的事情。
现在,如果您想要做的是快速尝试一些代码而不需要创建OSGi包的开销,这里有几个简单的方法我知道:
有两种方法可以在AEM中快速编写代码并进行测试,而无需创建完整的项目。
这是一个开源工具,允许您在AEM实例上执行Groovy代码。它使您可以访问Sling和JCR API,还允许您与OSGi服务进行交互。
它易于使用,只需安装,打开控制台页面,输入脚本并执行即可。
它提供了许多常用对象的Out Of the Box绑定,例如resourceResolver
,session
,pageManager
,queryBuilder
,slingRequest
等等。
它还提供了许多方便的方法,使Sling和JCR API更易于使用,以及一个非常简单的实用程序,允许您获取对OSGi服务的引用。
您询问了ResourceResolverFactory
,以下是如何在脚本中获取一个:
def resourceResolverFactory = getService("org.apache.sling.api.resource.ResourceResolverFactory")
控制台甚至可以为您生成此代码,它具有很好的自动完成功能:
查看the project on GitHub了解详情。
请注意,控制台本身使用了一堆OSGi包,因此代码实际上并不是独立的,因为它不是独立于OSGi环境而存在的。但是,用户不需要创建捆绑包并将其部署以试验代码。
您可能想要查看的另一个项目是AEM HTL REPL。我没有使用它,但我知道它允许您通过编写服务器端JavaScript来使用WCM使用API。
这基本上是@VAr's answer建议的内容。创建新组件或修改现有组件。
使用JSP scriptlet或使用WCM Use API的JavaScript。您可以在CRXDE中执行此操作,或使用实际的IDE编写代码,并使用Vault tool将其上载到AEM。 IntelliJ和Eclipse有很好的插件,可以让它更容易一些。
答案 1 :(得分:1)
如果您正在寻找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);
%>
答案 2 :(得分:1)
我不相信这是可能的,因为ResourceResolverFactory是由OSGi提供支持的Apache Sling的一部分。
话虽这么说,您应该能够使用用于单元测试的SlingMocks库。这将允许您从JSON文件加载一些示例内容,并在内存存储库中执行操作。
仅供参考:独立的Java程序倾向于使用JCR API与AEM存储库进行交互。
答案 3 :(得分:1)
正如其他人所说,这是不可能的。 ResourceResolverFactory
以@ProviderType
属性修饰。看到
ResourceResolverFactory Documentation。该属性使得实现对于OSGi框架非常特殊。
对于在AEM中尝试的事情,从AEM Documentation开始使用AEM锅炉板项目更容易。 OSGi和Sling的级别太低,它们唯一的真实单词值(在AEM的上下文中)位于servlet和组件模型绑定中。
作为参考,大多数独立的Apache Oak实用程序实现不使用ResourceResolver
,而是使用类的具体引用(因此强加了严格的版本兼容性要求)。
HTH
答案 4 :(得分:0)
您无法解析和实例化OSGI服务,例如运行OSGI环境上下文代码的ResourceResolverFactory。但是,如果要在那里测试某些东西,可以访问存储库并读取一些节点(例如数据)。为此,您可以使用以下代码创建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);