1

我对 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 仍然有效,因为它是完全重写的。)

在邮件列表/Nabble 中发现了相同的问题,但那里提供的答案不使用远程独立存储库,而是在同一个 servlet 容器甚至应用程序中运行的本地存储库(只是最终配置了 Mongo DB / Node 存储作为远程,但这意味着需要打开 Mongo 端口)。所以应用程序自己创建了存储库,这不是我的情况(我的情况在 Oak 中也可以正常工作)。

在 Jackrabbit2(不是 Oak)中,我可以简单地通过

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

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

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

但是,Oak 的文档说“Oak 带有一个可运行的 jar”,并且可运行的 jar提供了server启动服务器的方法,所以我假设我上面的场景是有效的。

4

2 回答 2

1

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

进入开发者模式以查看浏览器如何错误地解释该标签。

标题标签的错误解释

于 2017-08-23T17:00:21.970 回答
0

我从来没有见过像这样工作的长耳兔橡树的例子。你确定可以在你的应用程序之外启动橡树吗?你如何设置持久存储?(你要使用哪一个?)。

以下是您通常如何设置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(请参阅链接)

于 2016-10-24T12:53:08.340 回答