我正在尝试编写一些独立代码而不是 OSGi bundle 来学习和尝试 AEM 中的内容。在 OSGi 包中,我可以使用 @Reference
注释获取 ResourceResolverFactory
。
我想知道如何在我的独立代码中得到它。我需要这个工厂来获取ResourceResolver。我不确定这在独立代码中是否有可能。
实际上,另一个工厂 PageManagerFactory
也有同样的问题!
谢谢 - 阿图尔
最佳答案
在 OSGi 环境之外引用 OSGi 服务
这根本不可能。您需要 OSGi 运行时才能使用 OSGi 服务。
在独立的 Java 应用程序中,从技术上讲,您可以在 Java 程序的 main
方法中启动框架。查看Apache Felix docs看看如何。但说实话,如果您与 AEM 合作,我不认为这样做有什么意义。这只会让事情变得更加复杂。无论如何,您都需要 bundle ,并且您首先要重新发明 AEM 已经为您所做的事情。
现在,如果您想要快速试验一些代码,而无需创建 OSGi 包,那么这里有一些我知道的简单方法:
在 AEM 中试验代码
在 AEM 中快速编写代码并测试代码的几种方法,而无需创建完整的项目。
AEM Groovy 控制台
这是一个开源工具,允许您在 AEM 实例上执行 Groovy 代码。它使您可以访问 Sling 和 JCR API,还允许您与 OSGi 服务交互。
它很容易使用,只需安装它,打开控制台页面,输入脚本并执行它。
它为许多常用对象提供开箱即用的绑定(bind),例如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 环境而存在。但是,用户不需要创建 bundle 并部署它们只是为了试验代码。
AEM HTL REPL
您可能想查看的另一个项目是 AEM HTL REPL 。我没有使用过它,但我知道它允许您通过编写服务器端 JavaScript 来使用 WCM Use API。
使用 CRXDE
这本质上就是@VAr's answer建议。创建一个新组件或修改现有组件。
使用 JSP scriptlet 或利用 WCM Use API 的 JavaScript。您可以在 CRXDE 中执行此操作或使用实际的 IDE 来编写代码和 Vault tool将其上传到 AEM。 IntelliJ 有很好的插件和 Eclipse这让它变得更容易一些。
关于java - AEM/Sling - 如何在独立代码中创建 ResourceResolverFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41708758/