0

我只是想将我的本体添加到数据库存储库中……</p>

我的代码是:

oConnection = H2Db.getM_oConnection();
m_oSDBConnection = new SDBConnection(oConnection);
StoreDesc oStoreDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.H2);
m_oStore = SDBFactory.connectStore(m_oSDBConnection, oStoreDesc);
m_oModel = SDBFactory.connectDefaultModel(m_oStore);
InputStream oInputStream = this.getClass().getResourceAsStream("/META-INF/betaas_context.owl");
m_oModel.read(oInputStream, null);

开头有以下依赖:

ID   State         Blueprint      Level  Name
[ 994] [Active     ] [            ] [   80] H2 Database Engine (1.3.170)
[1114] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-iri_1.0.0 (0)
[1223] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-arq_2.11.0 (0) -> contains package org.apache.jena.riot.adapters
[1279] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-core_2.11.0 (0)
[1311] [Active     ] [            ] [   80] wrap_mvn_xerces_xercesImpl_2.7.1 (0)
[1314] [Active     ] [            ] [   80] wrap_mvn_com.ibm.icu_icu4j_3.4.4 (0)

我得到了这个例外:

java.lang.Exception: com.hp.hpl.jena.shared.ConfigException: Reader not found on classpath
Caused by: com.hp.hpl.jena.shared.ConfigException: Reader not found on classpath
Caused by: java.lang.ClassNotFoundException:
org.apache.jena.riot.adapters.JenaReadersWriters$RDFReaderRIOT_RDFXML

问题出在以下行:oModel.read(oInputStream, null);

编辑

然后,按照 AndyS 提到的建议(见下文),我更新了我的 Jena 库并使用了 2.11.1-SNAPSHOT:

[1511] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-core_2.11.1-SNAPSHOT (0)
[1512] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-arq_2.11.1-SNAPSHOT (0)
[1515] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-sdb_1.4.1-SNAPSHOT (0)
[1516] [Resolved   ] [            ] [   80] wrap_mvn_xerces_xercesImpl_2.11.0 (0)
[1521] [Active     ] [            ] [   80] wrap_mvn_org.apache.jena_jena-iri_1.0.1-SNAPSHOT (0)

但例外是一样的: ClassNotFoundException: org.apache.jena.riot.adapters.JenaReadersWriters$RDFReaderRIOT_RDFXML

4

4 回答 4

1

有一个与处理 .owl 文件有关的固定错误。这可能是您看到的某些异常的问题。当前的开发快照已修复此问题。

无关:您对 jena 的 xerces 版本错误。您不再需要 icu4j。

于 2013-10-16T21:28:19.233 回答
1

根本错误是以下类的 ClassNotFoundException org.apache.jena.riot.adapters.JenaReadersWriters$RDFReaderRIOT_RDFXML:。看起来这个库正在使用动态反射来加载类,例如 using Class.forName(),这是一件非常糟糕的事情。

无论如何,您应该可以通过将包添加org.apache.jena.riot.adapters到 Import-Package 列表来修复它。

于 2013-10-16T21:30:57.113 回答
0

谢谢你的帖子!!

我遇到了同样的问题,并通过在 jena-core.jar 的导入中添加 org.apache.jena.riot.adapters 包来解决它。

例如jena-core-2.11.1.jar的BND配置文件:

version=2.11.1
Bundle-Version: ${version}
Bundle-Name: Jena CORE
Export-Package: !etc, !jena, !jena-log4j.properties, !jena.cmdline, !ont-policy.rdf, *; version=${version}
Import-Package: org.apache.jena.riot.adapters, *
于 2014-07-01T16:54:59.883 回答
0

最后,这肯定是耶拿图书馆版本的问题。

我用以下方法解决了它:

xerces/xercesImpl/2.9.1
com.ibm.icu/icu4j/3.4.4
org.slf4j/slf4j-api/1.6.1

com.hp.hpl.jena/arq/2.8.7
com.hp.hpl.jena/jena/2.6.4
com.hp.hpl.jena/iri/0.8
com.hp.hpl.jena/sdb/1.3.4

正如 Andy S. 建议我的那样:“问题出在 bundling.jena-core 进行反射调用以设置 RIOT,而 RIOT 安装 JenaReadersWriters$RDFReaderRIOT_RDFXML。这是通过调用 Class.newInstance() 来实例化的。看起来像后者失败了。

这可能是因为 OSGi 捆绑设置的类加载器。您可能想要一个包含所有 Jena 罐子的捆绑包。据我了解您报告的设置,您有一个单独的包,因此是一个不同的类加载器,因此找不到。”

我还没有检查它,但可能解决方案是制作一个至少具有 2.11.0 版本的唯一捆绑 jar:

org.apache.jena/jena-core/2.11.0
org.apache.jena/jena-arq/2.11.0
org.apache.jena/jena-sdb/1.4.0
org.apache.jena/jena-iri/1.0.0
xerces/xercesImpl/2.11.0`
于 2013-10-29T09:40:38.503 回答