这就是我用jena.model.Model
写我的RDFDataMgr
的方法:
try {
Lang schema = Lang.RDFXML;
// System.out.println(System.getProperty("user.dir"));
File file = new File(owlDir);
FileOutputStream outputStream = new FileOutputStream(file, false);
outputStream.write("<?xml version=\"1.0\"?>\n".getBytes());
RDFDataMgr.write(outputStream, model, schema);
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
在打包之前,这段代码运行良好。但是在使用maven-assembly打包:assembly(insied IDEA),然后在另一个项目中导入此代码后,模型编写过程会抛出NullPointerException。
java.lang.NullPointerException
at org.apache.jena.riot.RDFWriterBuilder.build(RDFWriterBuilder.java:137)
at org.apache.jena.riot.RDFWriterBuilder.output(RDFWriterBuilder.java:149)
at org.apache.jena.riot.RDFDataMgr.write$(RDFDataMgr.java:1260)
at org.apache.jena.riot.RDFDataMgr.write(RDFDataMgr.java:1053)
at org.apache.jena.riot.RDFDataMgr.write(RDFDataMgr.java:1044)
at org.apache.jena.riot.RDFDataMgr.write(RDFDataMgr.java:985)
at seu.edu.kse.tools.ModelSaver.save2owl(ModelSaver.java:126)
at Main.main(Main.java:20)
models av儿.Java:126:
RDFDataMgr.write(outputStream, model, schema);
包ARQ.globalContext
中的org.apache.jena.query
为空。使用assembly
包装有什么问题吗?
我尝试使用model.write(outputStream, "RDF/XML")
来编写模型。这在打包后不会抛出任何异常,但结果文件的内容与打包之前写入的结果文件非常不同,所有<owl ...>
标记都缺失。
在Combining Apache Jena jars上查看此页面。基本上,Jena jar文件定义了一个文件中的初始化步骤,该文件位于jar中的路径META-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle
。使用Assembly插件重新打包后,此初始化文件不存在,因此Jena初始化不完整。这可以通过手动创建适当的文件来解决,或者通过Maven Shade插件自动解决。