Jena中无法从Jar包内OWL文件加载模型,正确实现方式是什么?
Jena加载Jar包内OWL文件的解决方法
Jena完全支持从Jar包内的文件条目加载模型,你之前的两种实现方式都存在用法错误,正确实现方案如下:
错误原因说明
- 第一种写法抛出
NotFoundException:旧版FileManager的默认路径解析逻辑没有兼容处理jar协议的!分隔符,无法识别Jar包内资源路径。 - 第二种写法抛出
IRIImplException:你使用的IRIFactory.iriImplementation()是严格校验模式,jar协议不在其默认的IANA注册scheme列表中,同时你错误调用了iri.getFragment()方法,仅传入了URI的#后缀部分,路径完全无效。
推荐实现方案
方案1:类加载器读取输入流加载(兼容性最优)
该方案依赖JDK原生类加载器处理Jar包资源查找,不需要处理复杂的协议路径,适配所有运行环境:
OntModel owlTimeModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_RDFS_INF); owlTimeModel.setNsPrefix("time", OWL_TIME + "#"); // 资源路径说明:和当前类同包直接写文件名,Jar包根路径开头需加/ try (InputStream inputStream = getClass().getResourceAsStream("/org/da/protoframework/jena/owl-time.owl")) { if (inputStream == null) { throw new RuntimeException("Jar包内未找到目标OWL文件"); } // 第二个参数为基础URI,无特殊需求传null即可 owlTimeModel.read(inputStream, null); m.add(owlTimeModel); } catch (IOException e) { e.printStackTrace(); }
方案2:使用RIOT API直接加载URI(Jena3+推荐)
Jena3及以上版本自带的RIOT解析器原生支持jar协议,不会做多余的scheme校验:
URI owlTimeURI = getClass().getResource("owl-time.owl").toURI(); OntModel owlTimeModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_RDFS_INF); owlTimeModel.setNsPrefix("time", OWL_TIME + "#"); RDFParser.create() .source(owlTimeURI.toString()) // 可省略lang参数,Jena会自动检测文件格式 .lang(Lang.RDFXML) .parse(owlTimeModel.getGraph()); m.add(owlTimeModel);
内容的提问来源于stack exchange,提问作者Hervé Girod
相关产品推荐
相关产品推荐

