Jackrabbit Oak:入门并通过 RMI 连接到独立存储库

Posted

技术标签:

【中文标题】Jackrabbit Oak:入门并通过 RMI 连接到独立存储库【英文标题】:Jackrabbit Oak: Getting started and connect to a standalone repository via RMI 【发布时间】:2017-03-04 15:41:43 【问题描述】:

我对 Jackrabbit 和 Jackrabbit Oak 完全陌生。不过,我与 Alfresco 合作了很多,这是另一个符合 JCR 的开源内容存储库。

我想启动一个独立的 Jackrabbit Oak 存储库,然后通过 Java 代码连接到它。不幸的是,Oak 文档非常稀缺。

我查看了 Oak 存储库,使用 mvn clean install 构建它,然后通过以下方式运行独立服务器(内存存储库目前对我来说可以进行测试):

$ java -jar oak-run-1.6-SNAPSHOT.jar server

Apache Jackrabbit Oak 1.6-SNAPSHOT
Starting Oak-Memory repository -> http://localhost:8080/
13:14:38.317 [main] WARN  o.a.j.s.r.d.ProtectedRemoveManager - protectedhandlers-config is missing -> DIFF processing can fail for the Remove operation if the content toremove is protected!

当我打开 http://localhost:8080/ 时,我看到一个空白页面,其中包含类似这样的代码,但 html / xhtml 输出作为源代码如下:

我尝试通过 Java 代码连接:

JcrUtils.getRepository("http://localhost:8080");
// or
JcrUtils.getRepository("http://localhost:8080/rmi");

但得到:

Connecting to http://localhost:8080
Exception in thread "main" javax.jcr.RepositoryException: Unable to access a repository with the following settings:
    org.apache.jackrabbit.repository.uri: http://localhost:8080
The following RepositoryFactory classes were consulted:
    org.apache.jackrabbit.oak.jcr.OakRepositoryFactory: declined
    org.apache.jackrabbit.commons.JndiRepositoryFactory: declined
Perhaps the repository you are trying to access is not available at the moment.
    at org.apache.jackrabbit.commons.JcrUtils.getRepository(JcrUtils.java:223)
    at org.apache.jackrabbit.commons.JcrUtils.getRepository(JcrUtils.java:263)
    at Main.main(Main.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

(Oak 文档不如 Jackrabbit 文档完整,但我也不确定 Jackrabbit 2 中多少内容对 Oak 仍然有效,因为它是完全重写的。)

我找到了same question in the mailing list/Nabble,但那里提供的答案没有使用远程的独立存储库,而是在同一个 servlet 容器甚至应用程序中运行的本地存储库(只是最终将 Mongo DB/Node 存储配置为远程,但这意味着需要打开 Mongo 端口)。所以应用程序自己创建了存储库,这不是我的情况(我的情况在 Oak 中也可以正常工作)。

在 Jackrabbit2(不是 Oak)中,我可以简单地通过以下方式连接

Repository repo = new URLRemoteRepository("http://localhost:8080/rmi");

它工作正常,但似乎此方法不适用于 Oak。

在 Oak 中是否默认不启用 RMI?是否有不同的 URI 可供使用?

但是,documentation of Oak 说“Oak 带有一个可运行的 jar”,runnable jar 提供了 server 方法来启动服务器,所以我假设我的上述方案是有效的。

【问题讨论】:

【参考方案1】:

空白页是您的浏览器无法解析<title/>标签的结果。

进入开发者模式,看看浏览器是如何错误解释该标签的。

Incorrect interpretation of title tag

【讨论】:

【参考方案2】:

我从未见过像这样工作的长耳兔橡木示例。您确定可以在您的应用程序之外启动橡木吗? 你如何设置持久存储? (你打算用哪一个?)。

这里是您通常如何设置jackrabbit Oak 的链接:https://jackrabbit.apache.org/oak/docs/construct.html

例如,如果你使用 MongoDB 作为后端(这是最强大的),你首先通过

连接到数据库
Db db = new MongoClient(ip, port).getDB("testDB");

其中 ip 是 MongoDB 服务器的 IP 地址及其端口。该服务器不需要像运行 Java 代码那样位于同一台机器上。您甚至可以使用副本集代替单个 MongoDB 实例。 使用关系数据库也是如此。仅当您选择 tar 文件系统后端时,您才仅限于本地计算机。 然后,在第二步中,您根据所选后端创建一个 jcr(请参阅链接)

【讨论】:

是的,很确定,至少文档是这么说的。请参阅jackrabbit.apache.org/oak/docs/use_getting_started.html“Oak 带有一个可运行的 jar”和github.com/apache/jackrabbit-oak/blob/trunk/oak-run/README.md ->“服务器”模式。 runnable 使用与 JR2 相同的选项,不同之处在于它可以与 JR2 一起使用,但不能立即与 Oak 一起使用。 根据您的链接构建本地存储库对我来说已经很好了,我之前也这样做过。但是使用远程存储库不起作用。我在这里得到了一些信息,Apache Sling 可能是解决这个问题的最佳方法jackrabbit.510166.n4.nabble.com/… 回复:“如何设置持久存储?” -> 内存存储,仅用于测试。不过这不重要,我只想连接到远程仓库,因此客户端不应该关心底层存储技术。 “Oak 服务器模式使用标准 JCR 插件启动一个 NodeStore 或完整的 Oak 实例,并通过在 Oak-http 组件中定义的简单 HTTP 映射使其可用。”。关于 Oak-http,我的印象是您只能通过 http 直接访问正在运行的 Oak 存储库,但我认为您不能从中构建 Java 存储库对象……但最后,我不知道:) 好的,谢谢您的回复。我只是想知道为什么它适用于 JackRabbit2,但不适用于 Oak。即使它是一个完整的重写,我会认为它会以同样的方式工作。最后,无论如何,我可能会在我的实际应用程序中使用嵌入式 Oak 服务器。我基本上只是在周末尝试一下,并在那里测试不同的模式。

以上是关于Jackrabbit Oak:入门并通过 RMI 连接到独立存储库的主要内容,如果未能解决你的问题,请参考以下文章

Apache Jackrabbit 和 Jackrabbit Oak 有啥区别?

Apache Jackrabbit OAK - 按节点路径跨集群分片 DocumentNodeStore

Apache Jackrabbit Oak 1.5.9 发布

JackRabbit Oak:我的应用程序需要很长时间才能启动/重新启动

向 ACL 添加限制会在 Jackrabbit Oak 中的查询产生空结果

Jackrabbit Oak 合并不保存更改