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

Java AEM/Sling-如何在独立代码中创建ResourceResolverFactory?,java,osgi,aem,jcr,sling,Java,Osgi,Aem,Jcr,Sling,我试图编写一些独立的代码,而不是一个OSGi捆绑包来学习和尝试AEM中的东西。在OSGi包中,我可以使用@Reference注释获得ResourceResolveFactory 我想知道如何在我的独立代码中得到它。我需要此工厂获取资源解析程序。我不确定这在独立代码中是否有可能 实际上,同样的问题也适用于另一家工厂,PageManagerFactory 谢谢 -Atul如果您正在查找JSP级别的代码段,下面的代码段将创建一个调用此JSP的页面版本。希望这有帮助 <%@include file

我试图编写一些独立的代码,而不是一个OSGi捆绑包来学习和尝试AEM中的东西。在OSGi包中,我可以使用
@Reference
注释获得
ResourceResolveFactory

我想知道如何在我的独立代码中得到它。我需要此工厂获取
资源解析程序
。我不确定这在独立代码中是否有可能

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

谢谢
-Atul

如果您正在查找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的一部分

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


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

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

为了在AEM中进行试验,更容易从AEM锅炉板项目开始。OSGi和Sling的级别太低,它们唯一的真实单词值(在AEM上下文中)位于servlet和组件模型绑定中

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

HTH

在OSGi环境之外引用OSGi服务 这根本不可能。您需要OSGi运行时来使用OSGi服务,句号

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

现在,如果您想做的是在不增加创建OSGi捆绑包的开销的情况下快速试验一些代码,我知道以下几种简单的方法:

在AEM中试验代码 有两种方法可以快速编写代码并在AEM中进行测试,而无需创建完整的项目

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

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

它为许多常用对象提供现成的绑定,例如
资源解析程序
会话
页面管理器
查询生成器
slingRequest
等等

它还提供了许多方便的方法,使Sling和jcrapi更易于使用,以及一个非常简单的实用工具,允许您获取对OSGi服务的引用

您询问了关于
ResourceResolverFactory
,下面是如何在脚本中获得一个:

def resourceResolverFactory = getService("org.apache.sling.api.resource.ResourceResolverFactory")
控制台甚至可以为您生成此代码,它有一个很好的自动完成功能:

查看了解更多信息

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

AEM HTL REPL 您可能希望查看的另一个项目是。我没有使用过它,但我知道它允许您通过编写服务器端JavaScript来使用WCM use API

玩CRXDE 从本质上说,这就是建议。创建新零部件或修改现有零部件


使用JSP脚本或使用WCM Use API的JavaScript。您可以在CRXDE中完成,也可以使用实际的IDE编写代码并将其上载到AEM。有一些很好的插件,可以让它变得更简单。

您无法解析和实例化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);

实际上,我正在寻找一种在独立java程序中而不是在jsp或OSGi捆绑包中获得ResourceResover的方法。在我的OSGi包中,我可以通过@Reference注释获得工厂对象。我不知道如何在Java程序中创建它们(使用main)。e、 g.
@Component(name=“com.cisco.wem.author.rendition.workflow.EOTRenditionPageCreation”,specVersion=“1.1”,metatype=true)@Service公共类EOTRenditionPageCreation{@Reference private PageManagerFactory pageMangerFactory;@Reference ResourceResolveFactory ResourceResolveFactory;
感谢大家的澄清!我现在了解了Sling和JCR API之间的区别。