Jackrabbit Oak:通过RMI开始并连接到独立的存储库

时间:2016-10-22 11:40:10

标签: jackrabbit jackrabbit-oak

我对Jackrabbit和Jackrabbit Oak来说是全新的。不过,我和Alfresco合作过很多,这是另一个符合JCR标准的开源内容回购。

我想开始一个独立的Jackrabbit Oak repo,然后通过Java代码连接到它。不幸的是,Oak文档非常缺乏。

我查看了Oak repo,用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输出为源代码,如下所示:

enter image description here

我尝试通过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方法来启动服务器,所以我假设上面的场景是有效的之一。

2 个答案:

答案 0 :(得分:1)

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

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

Incorrect interpretation of title tag

答案 1 :(得分:0)

我从来没有看到像这样工作的长耳大麻橡木的例子..你确定可以在你的应用之外启动橡木吗? 你如何设置持久性商店? (你要使用哪一个?)。

以下是您正常设置长耳大块橡木的链接:https://jackrabbit.apache.org/oak/docs/construct.html

例如,如果您使用MongoDB作为后端(功能最强大),则首先通过

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

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