OSGi: wie gewährleisten Sie die classpath-Konsistenz?

Gemäß der OSGi-Dokumentation, OSGi ist entworfen, um zu helfen verhindern, dass die ClassPath-Probleme.

Beispielsweise von "OSGi in action":

ClassNotFoundExceptions beim starten der Anwendung, weil die
Klasse Pfad war nicht korrekt. OSGi können helfen, indem Sie sicherstellen, dass code
Abhängigkeiten erfüllt sind, bevor der code ausgeführt werden soll.

Jedoch, seit wir gewechselt haben, unsere java-Anwendung OSGi, sehe ich mehr ClassNotFoundExceptions und vor allem NoClassDefFoundErrors als je zuvor. Klassen, die vorher feinen laden findet man nicht mehr von der OSGI classloader, und schlimmer noch: Sie erhalten die Fehlermeldung in run-time, was bedeutet, dass Sie nicht einfach zu überprüfen, außer durch die manuelle Prüfung jeder Ecke der Anwendung.

Beispielsweise die, unser Antrag wurde problemlos ausgeführt unter OSGi, aber wir erhalten Berichte von beta-Testern, dass Sie nicht exportieren Sie Dokumente in PDF nicht mehr. In der Tat, wenn ich sah in ihm, ich fand, dass diese Funktionalität verursacht eine Ausnahme protokolliert werden:

java.lang.NoClassDefFoundError: org/w3c/dom/Node

So, ist OSGi eigentlich die Schaffung von mehr classpath-Probleme, als Sie löst?

und noch wichtiger: Wie kann ich testen, ob meine Klasse-Pfad ist konsistent mit allen notwendigen Import-Package-Anweisungen etc. vor ich über Sie zu Lesen in bug-reports?

  • "außer durch die manuelle Prüfung jeder Ecke der Anwendung" - erm automatisierten tests? (das gleiche gilt für jede Anwendung), Wenn Sie hatte eine test-suites, bevor Sie migriert sind, die Sie haben würden, entdeckte diesen Fehler noch vor der Tester hatte. Um zu testen, ob Ihr Bündel Draht, richtig, Sie benötigen dazu einige Integrationstests - wir sind mit Pax Exam für diese und haben kurze integration tests (aktuelle bundle und es ist Mitarbeitern) sowie einige längere Ende-zu-Ende-tests (testen der gesamten app).
  • Für die Suche nach dieser stack-überlauf, wenn Sie auf der Suche OSGi NoClassDefFound.... halten Sie es daran, dass die aktuelle Java-thread ausführen, das OSGi-bundle-code bestimmt die "aktive" ClassLoader aka Thread-Kontext-ClassLoader (TCCL). Die "active" - ClassLoader kann nicht der ClassLoader des OSGi-container erstellt für die bundle-code. Damit alles klappt, manchmal muss man manuell wechseln, der thread ist TCCL.
  • Siehe 2012. Neil Bartlett. "Der Gefürchtete Thread Context Class Loader", blogs.paremus.com/2012/10/....
InformationsquelleAutor amarillion | 2011-09-19
Schreibe einen Kommentar