耶拿 TDB java.lang.ExceptionInInitializerError
Jena TDB java.lang.ExceptionInInitializerError
我正在使用 Jena TDB 加载 RDF 数据集并对它进行 SPARQL 查询。我正在使用以下 Maven 依赖项:
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>3.0.1</version>
</dependency>
这是我尝试创建 TDB 数据集的 java 代码:
public void loadDirectory(String outputFile){
Dataset dataset = TDBFactory.createDataset(directoryPath);
Model tdb = dataset.getDefaultModel();
FileManager.get().readModel(tdb, outputFile);
tdb.close();
dataset.close();
LOG.info("RDF dataset loaded to memory");
}
它在函数的第一行失败:TDBFactory.createDataset( directoryPath ) 并出现以下错误消息:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.sdw.model.JenaModel.loadDirectory(JenaModel.java:69)
at org.sdw.Main.main(Main.java:75)
Caused by: java.lang.NullPointerException
at org.apache.jena.tdb.sys.EnvTDB.processGlobalSystemProperties(EnvTDB.java:33)
at org.apache.jena.tdb.TDB.init(TDB.java:250)
at org.apache.jena.tdb.sys.InitTDB.start(InitTDB.java:29)
at org.apache.jena.system.JenaSystem.lambda$init(JenaSystem.java:114)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:179)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:156)
at org.apache.jena.system.JenaSystem.init(JenaSystem.java:111)
at org.apache.jena.tdb.TDBFactory.<clinit>(TDBFactory.java:40)
POM 使用了 shade 插件。它需要使用 ServicesResourceTransformer 转换器来管理服务文件 (META_INF/services/)。
将以下转换添加到您的 POM 文件中:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
请参见此处 <transformers>
例如:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
我遇到了同样的问题,发现接受的答案大体上是正确的但不完整(至少我花了很长时间才弄清楚如何正确应用答案的提示)。这是它的工作原理。
1) 您必须将 maven-shade 插件添加到您 pom.xml 中,例如在:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
2) 将插件配置中的link更改为主要的class。主要 class 通过以下几行提供:
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.apache.jena.fuseki.cmd.FusekiCmd</mainClass>
</transformer>
您必须在 mainClass
标签中添加 main class。现在使用 maven build 命令构建项目时,您将获得一个名为 your-project-name-VERSION.jar
的 jar,这是您想要的 运行nable jar。如果您以前使用 "jar with dependencies",那么请确保 运行 新的(名称中不再包含 "with dependencies"),否则您将 运行同样的问题。
接受的答案实际上缺少解决方案。
所以这里是:
链接文件是:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
当然,你能从中得到什么?
这是您应该添加到 pom 中的完整片段:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
记得将 com.example.MainClass
替换为您的主要 class
我正在使用 Jena TDB 加载 RDF 数据集并对它进行 SPARQL 查询。我正在使用以下 Maven 依赖项:
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>3.0.1</version>
</dependency>
这是我尝试创建 TDB 数据集的 java 代码:
public void loadDirectory(String outputFile){
Dataset dataset = TDBFactory.createDataset(directoryPath);
Model tdb = dataset.getDefaultModel();
FileManager.get().readModel(tdb, outputFile);
tdb.close();
dataset.close();
LOG.info("RDF dataset loaded to memory");
}
它在函数的第一行失败:TDBFactory.createDataset( directoryPath ) 并出现以下错误消息:
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.sdw.model.JenaModel.loadDirectory(JenaModel.java:69)
at org.sdw.Main.main(Main.java:75)
Caused by: java.lang.NullPointerException
at org.apache.jena.tdb.sys.EnvTDB.processGlobalSystemProperties(EnvTDB.java:33)
at org.apache.jena.tdb.TDB.init(TDB.java:250)
at org.apache.jena.tdb.sys.InitTDB.start(InitTDB.java:29)
at org.apache.jena.system.JenaSystem.lambda$init(JenaSystem.java:114)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:179)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:156)
at org.apache.jena.system.JenaSystem.init(JenaSystem.java:111)
at org.apache.jena.tdb.TDBFactory.<clinit>(TDBFactory.java:40)
POM 使用了 shade 插件。它需要使用 ServicesResourceTransformer 转换器来管理服务文件 (META_INF/services/)。
将以下转换添加到您的 POM 文件中:
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
请参见此处 <transformers>
例如:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
我遇到了同样的问题,发现接受的答案大体上是正确的但不完整(至少我花了很长时间才弄清楚如何正确应用答案的提示)。这是它的工作原理。
1) 您必须将 maven-shade 插件添加到您 pom.xml 中,例如在:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
2) 将插件配置中的link更改为主要的class。主要 class 通过以下几行提供:
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.apache.jena.fuseki.cmd.FusekiCmd</mainClass>
</transformer>
您必须在 mainClass
标签中添加 main class。现在使用 maven build 命令构建项目时,您将获得一个名为 your-project-name-VERSION.jar
的 jar,这是您想要的 运行nable jar。如果您以前使用 "jar with dependencies",那么请确保 运行 新的(名称中不再包含 "with dependencies"),否则您将 运行同样的问题。
接受的答案实际上缺少解决方案。 所以这里是:
链接文件是:https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml
当然,你能从中得到什么?
这是您应该添加到 pom 中的完整片段:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
记得将 com.example.MainClass
替换为您的主要 class