2016-08-04 9 views
1

jena-osgi 3.0.1 ModelFactory.createDefaultModel() wirft eine ExceptionInInitializerError, wenn wir den folgenden Code in einem JUNIT (4,11) -Umgebung in Eclipse ausführen:Jena-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()); 

Der Stapel Spur ist die folgende:

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 

der gleiche Code funktioniert, wenn wir jena-tdb 3.0.1 statt jena-osgi 3.0.1 verwenden. Wir müssen unseren Code in einer OSGi-Umgebung (Servicemix) ausführen, daher ist es wichtig, dass das OSGi-Stück funktioniert.

Ich habe ähnliche Fehler in Stack Overflow gemeldet, aber keiner von ihnen hat unser Problem gelöst. Ich denke, vielleicht fehlt uns eine Bibliothek? Dies sind die Gläser wir mit Maven importieren:

  1. org.apache.jena: 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-Sammlungen: 0.2
  4. Gemeinen-cli: Common-cli: 1.3
  5. Common-Codec: Common-Codec: 1.6
  6. Common-io: commons-io: 2.4
  7. org.apache.httpcompone nts: Httpclient-Cache: 4.2.5
  8. xml-apis: xml-apis: 1.4.01

HINWEIS: haben wir versucht, Jena 3.1.0 OSGi und dass man funktioniert, aber die JSON- zu verwenden LD kommt komisch heraus, wenn junit in maven ausgeführt wird (die XML-Namespacepräfixe werden entfernt), funktioniert aber in Eclipse einwandfrei.

+0

Mit JSON meinen Sie JSON-LD? Was haben sonst XML-Namespaces mit JSON zu tun? Sieht nach einem separaten Problem für das OSGi-Problem für mich aus. – AndyS

+1

https://issues.apache.org/jira/browse/JENA-1164 ist die Lösung für OSGi-Probleme. Dies beinhaltete Upgrades auf Dexx-Kollektionen. – AndyS

+0

Ja, ich meinte JSON-LD und ja, es ist ein separates Problem. Ich fügte diesen "Hinweis" hinzu, nur damit klar war, dass wir andere Versionen ausprobiert haben und die Dinge mit anderen Versionen semi-arbeiten. – Thirlan

Antwort

0

@ RobV Antwort liefert eine Lösung für die korrekte Verpackung OSGi-Bundle für alle ServiceLoader-Dateien.

Upgrade nach Jena 3.1.0 (speziell für JENA-1164) ist die Lösung für Probleme mit jena-osgi im Hinblick auf das Auffinden von ServiceLoader-Dateien in verschiedenen OSGi-Frameworks.

2

Ihr Problem betrifft wahrscheinlich Jena Systeminitialisierung. Es beruht auf dem ServiceLoader Mechanismus und wenn Sie also nicht über die richtigen META-INF/services/ Ressourcen verfügen, werden nur Teile des Systems eingerichtet und Komponenten wie TDB, die auf anderen Komponenten basieren, können als Ergebnis nicht initialisiert werden.

Sie sehen das gleiche Problem haben, wie in der folgenden Mailing-Liste Thread beschrieben - [http://mail-archives.apache.org/mod_mbox/jena-users/201603.mbox/%[email protected]%3E]

Die vorgeschlagene Lösung ist wie folgt:

Der Standardwert ist ServiceLoader die für META-INF/services/org.apache.jena.system.JenaSubsystemLifecycle schaut zu verwenden

Wenn Ihr Setup ein einzelnes Glas ist dann der Inhalt dieses von allen Module muss kombiniert werden:

Zum Beispiel Fuseki, die ein kombiniertes Glas ist, hat: während Beschattung mit

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 

Es ist in der POM getan:

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

Danke für das Setzen, ich habe es gewählt. Am Ende ist es jedoch einfacher, zu 3.1.0 zu wechseln. – Thirlan

Verwandte Themen