Java 从流生成模型(异常:在类路径上找不到读取器)

Java 从流生成模型(异常:在类路径上找不到读取器),java,osgi,h2,jena,Java,Osgi,H2,Jena,我只是想把我的本体添加到数据库存储库 我的代码是: oConnection = H2Db.getM_oConnection(); m_oSDBConnection = new SDBConnection(oConnection); StoreDesc oStoreDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, DatabaseType.H2); m_oStore = SDBFactory.connectStore(m_oSDBConn

我只是想把我的本体添加到数据库存储库

我的代码是:

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$rdfreaderrio\u RDFXML

处理.owl文件时有一个固定错误。这可能是您看到的一些例外的问题。当前的开发快照修复了此问题

无关的:
你把xerces的版本错给jena了。您不再需要icu4j。

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


无论如何,您应该能够通过将包
org.apache.jena.riot.adapters
添加到导入包列表来修复它。

最后,这肯定是jena库版本的问题

我用以下方法解决了这个问题:

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.向我建议的:“问题在于捆绑。jena-core进行反射调用以设置RIOT,RIOT安装JenaReadersWriters$RDFReaderRIOT_RDFXML。这是通过调用Class.newInstance()实例化的。后者似乎失败了

这可能是因为OSGi绑定设置了类加载器。您可能想要一个包,其中包含所有Jena jar。据我所知,您报告的设置是单独的包,因此有一个不同的类加载器,因此找不到。“

我还没有检查它,但解决方案可能是制作一个具有至少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`
谢谢你的帖子

我也有同样的问题,只是在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, *

是否有可能OP没有尝试通过反射加载此文件,但这与相关?如果错误是Jena使用Class.forName(),则可能是。你是对的,OP自己没有直接使用反射,这是图书馆的错。