2017-11-15 3 views
1

Ich habe ein OSGi-Setup mit Maven. Die pom.xml des Elternpakets hat eine Abhängigkeit von JAR A, die wiederum von JAR B (Version 1) abhängig ist. Der Elternteil hat 2 Kinderbündel. Kindbündel 1 verwendet JAR B mit Version 1. Kindbündel 2 erfordert JAR B mit Version 2. Die JARs sind nicht abwärtskompatibel. Daher kann ich die Version von JAR B nicht von 1 auf 2 aufrüsten. Ich brauche die Version 1 von JAR in Bundle 1 und Version 2 derselben JAR in Bundle 2, ohne Fehler beim Laden von Klassen.Wie werden zwei Versionen derselben JAR in zwei OSGi-Bundles verwendet?

Im Moment bekomme ich einen Fehler beim Laden der Klasse, wo eines der Bündel wegen NoClassDefFound Fehler wegen der Verwendung von 2 Versionen fehlschlagen.

Wie löse ich diese Abhängigkeit mit OSGi?

+0

Bis jetzt haben Sie nur Ihr Maven Setup beschrieben. In OSGi ist dies nicht so wichtig. Zur Laufzeit in OSGi ist es wichtig, welche Import-Package- und Export-Package-Anweisungen die Manifeste enthalten. Kannst du das zu deiner Frage hinzufügen? Etwas anderes. Wie erstellst du das Manifest deiner Bündel? –

+0

@ChristianSchneider Ich habe keine Informationen über JAR B im Import-Paket und Export-Paket der beiden Pakete hinzugefügt. Aber ich habe "Bundle 1" in der Require-Bundle-Eigenschaft von Bundle 2 hinzugefügt. Beeinflusst das irgendetwas? – user2458672

+0

Sie sollten Require-Bundle nicht verwenden. Stattdessen lassen Sie bnd durch maven-bundle-plugin oder bnd-maven-plugin das Manifest für sich schreiben. Einbetten der Abhängigkeit wie gjoranv vorgeschlagen ist ebenfalls möglich. –

Antwort

0

Einer der Vorteile von OSGi (wohl der wichtigste) ist, dass Sie können verschiedene Versionen der gleichen Bibliothek in verschiedenen Bundles verwenden. In den wenigen Fällen, in denen dies ein Problem ist, erhalten Sie entweder eine 'Lader-Constraint-Verletzung' oder eine 'ClassCastException'. Das OSGi Troubleshooting-Dokument für die Vespa-Suchmaschine zeigt einige examples. Dies würde passieren, wenn eines Ihrer Bundles eine API in einem anderen Bundle mit den Klassen in JAR B (als Argument oder Rückgabewert) aufruft und die beiden Bundles unterschiedliche Versionen von B verwenden. In Ihrem Fall besteht das Problem darin entweder fehlt dem fehlerhaften Paket ein Import-Paket und/oder es gibt kein Paket, das die erforderliche Version des Pakets mit der fehlenden Klasse exportiert. Sie können überprüfen, ob die Bündel manifest.mf sind.

Der einfachste und sicherste Weg, dies zu lösen, besteht darin, die gewünschte Version von B in jedes Ihrer untergeordneten Pakete einzubetten. Auf diese Weise verwenden Ihre untergeordneten Pakete ihre eigene Version von B und leben in separaten Klassenladeprogrammen.

Sie erwähnen nicht, wie Sie Ihre Bundles packen, aber wenn Sie die maven-bundle-plugin verwenden, hat es eine Embed-Dependency Konfigurationsoption. Beachten Sie, dass Sie auch die transitiven Abhängigkeiten von B einbetten müssen, indem Sie die Anweisung Embed-Transitive verwenden, um sicherzustellen, dass der gesamte in B verwendete Code zur Laufzeit verfügbar ist.

Eine andere Lösung ist möglich, wenn beide Versionen von B als OSGi-Bundles verpackt sind und jeder das Paket (der fehlenden Klasse) mit einer eindeutigen Versionsnummer exportiert. (Überprüfen Sie erneut, ob Sie Bs manifest.mf ansehen). Anschließend können Sie beide B-Bundles bereitstellen und jedes Ihrer untergeordneten Bundles die richtige Version importieren.

+0

Aktualisierte meine Antwort mit etwas mehr Details und einem alternativen Vorschlag. – gjoranv

Verwandte Themen