5

我正在使用 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$40(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)
4

3 回答 3

5

POM 使用阴影插件。它需要使用 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

于 2016-04-21T12:22:57.420 回答
1

接受的答案实际上缺少解决方案。所以这里是:

链接文件为: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用你的主类替换

于 2018-12-08T14:11:48.070 回答
1

我遇到了同样的问题,发现接受的答案通常是正确的,但并不完整(至少我花了很长时间才弄清楚如何正确应用答案的提示)。下面是它的工作原理。

1)您必须将 maven-shade 插件添加到 pom.xml 中,例如:https ://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml

2)在插件配置中更改主类的链接。主类通过以下几行提供:

<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
          <mainClass>org.apache.jena.fuseki.cmd.FusekiCmd</mainClass>
</transformer>

您必须在mainClass标签中添加主类。现在使用 maven build 命令构建项目时,您将获得一个名为的 jar your-project-name-VERSION.jar,它是您想要的可运行 jar。如果您之前使用过“带有依赖项的 jar”,请确保运行新的(名称中不再包含“带有依赖项”),否则您将遇到同样的问题。

于 2018-05-14T06:55:45.573 回答