2016-04-20 49 views
0

我正在使用Jena TDB加載RDF數據集並對其進行SPARQL查詢。我使用以下Maven的依賴:Jena TDB java.lang.ExceptionInInitializerError

<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) 
+1

的代碼工作正常。環境中可能更多。當Jena jar被重新捆綁(例如OSGi)或重新打包並且'META-INF/services/org.apache.jena.system.JenaSubsystemLifecycle'文件沒有被正確合併時,通常會發生此錯誤。 – AndyS

+0

請提供一個完整的,最簡單的例子。其他人可以運行不變的東西,只需要說明問題就可以了。 – AndyS

+0

該代碼不會將數據加載到內存中。 – AndyS

回答

4

POM使用陰影插件。它需要使用ServicesResourceTransformer變換器來管理服務文件(META_INF/services /)。 org.apache.maven.plugins.shade.resource.ServicesResourceTransformer

見例如:如果只是codeis運行https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml

+0

我明白了,我犯了一個愚蠢的錯誤。感謝您幫助我:) – gonephishing

+0

@Andys嗨,那麼這是什麼解決方案?我遇到了同樣的問題。如何解決它。特別是我正在與sbt合作,並且建立一個裝配罐。 – MaatDeamon

+0

請參閱https://github.com/apache/jena/blob/master/jena-fuseki2/jena-fuseki-server/pom.xml - 結合了ServiceLoader文件的「ServicesResourceTransformer」。如果您需要手動執行該操作,因爲SBT不能,那麼將META_INF/services /下的文件連接到所有罐子。 – AndyS