2016-08-04 56 views
1

Jena的OSGi的3.0.1 ModelFactory.createDefaultModel()拋出當我們在JUNIT運行下面的代碼的的ExceptionInInitializerError(4.11)環境在Eclipse:耶拿的OSGi 3.0.1的ExceptionInInitializerError processGlobalSystemProperties

// Convert the XML to RDF model 
StringReader stringReader = new StringReader(xml); 
Model model = ModelFactory.createDefaultModel(); 
model.read(stringReader, null, RDFLanguages.RDFXML.getLabel()); 

堆棧跟蹤如下:

java.lang.ExceptionInInitializerError 
... 
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.rdf.model.ModelFactory.<clinit>(ModelFactory.java:49) 
    ... 25 more 

相同的代碼工作,如果我們使用耶拿-TDB 3.0.1,而不是在耶拿的OSGi的3.0.1。我們需要在OSGi環境(Servicemix)中運行我們的代碼,所以我們得到OSGi的一部分是非常重要的。

我在堆棧溢出中看到類似的錯誤報告,但他們都沒有解決我們的問題。我在想也許我們錯過了一個圖書館?這些都是我們在使用Maven進口的罐子:

  1. org.apache.jena:耶拿OSGi的:3.0.1
  2. org.apache.servicemix.bundles:org.apache.servicemix.bundles.xerces: 2.11.0_1
  3. com.github.andrewoma.dexx:dexx-集合:0.2
  4. 公地-CLI:公地-CLI:1.3
  5. 公地編解碼器:公地編解碼器:1.6
  6. 公地-10: commons-io:2.4
  7. org.apache.httpcompone NTS:HttpClient的緩存:4.2.5
  8. XML的API:XML的API:1.4.01

注意:我們試圖用耶拿3.1.0 OSGi和一個沒有工作,但JSON-當junit在maven中運行時(xml命名空間前綴被剝離),LD顯得很奇怪,但在Eclipse中工作正常。

+0

通過JSON,你的意思是JSON-LD?否則有什麼有XML名稱空間去做與JSON?看起來像是一個單獨的問題給我的OSGi問題。 – AndyS

+1

https://issues.apache.org/jira/browse/JENA-1164是OSGi問題的修復。這包括升級Dexx系列。 – AndyS

+0

是的,我的意思是JSON-LD,是的它是一個單獨的問題。我添加了「註釋」,所以很明顯,我們已經嘗試了其他版本,並且其他版本都是半工作的。 – Thirlan

回答

0

@ RobV的答案提供了一個解決方案,正確裝箱OSGi包含所有ServiceLoader文件。

升級到Jena 3.1.0(專門針對JENA-1164)是修復了與在不同OSGi框架中查找ServiceLoader文件有關的jena-osgi問題。

2

您的問題很可能與耶拿系統初始化相關。它依賴於ServiceLoader機制,因此,如果您沒有正確的META-INF/services/資源,則只會部分系統被設置,而像TDB這樣依賴其他組件的組件可能無法初始化。

你看看有如下面的郵件列表線程中描述了同樣的問題 - [http://mail-archives.apache.org/mod_mbox/jena-users/201603.mbox/%[email protected]%3E]

建議的解決方案有如下:

默認是使用ServiceLoader看起來爲META-INF/services/org.apache.jena.system.JenaSubsystemLifecycle

如果您的設置是一個單獨的jar,那麼這個來自所有 模塊的內容需要合併:

例如,定式,這是一個組合的罐子,有:

org.apache.jena.tdb.sys.InitTDB 
org.apache.jena.riot.system.InitRIOT 
org.apache.jena.sparql.system.InitARQ 
org.apache.jena.system.InitJenaCore 
org.apache.jena.query.text.InitJenaText 
org.apache.jena.query.spatial.InitJenaSpatial 

它在POM具有遮光期間完成:

<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
+0

感謝您提出這個問題,我投了票。但最後切換到3.1.0更簡單。 – Thirlan