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>

И вот код Java, где я пытаюсь создать набор данных TDB:

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)

2 ответа

Решение

POM использует плагин Shade. Он должен управлять файлами служб (META_INF/services/) с помощью преобразователя ServicesResourceTransformer. org.apache.maven.plugins.shade.resource.ServicesResourceTransformer

См. Например: https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml

В принятом ответе фактически отсутствует решение. Итак, вот оно:

Связанный файл: https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml

Конечно, что вы должны получить от этого?

Вот полный фрагмент, который вы должны добавить к вашему пом:

<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 с вашим основным классом

У меня была та же проблема, и я обнаружил, что принятый ответ в целом правильный, но не полный (по крайней мере, у меня ушло довольно много времени, прежде чем я понял, как правильно применить подсказку к ответу). Вот как это работает.

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, вы получите банку с именем your-project-name-VERSION.jar которая является пригодной для использования банкой, которую вы хотите иметь. Если вы ранее работали с "флягой с зависимостями", то обязательно запустите новую (которая больше не включает в себя "с зависимостями" в имени), иначе вы столкнетесь с той же проблемой.

Другие вопросы по тегам