Bundle-A:OSGi classloading: Warum importiert BND Klassen, die nicht direkt referenziert werden?
FooA.java
package com.foo.a;
import com.foo.b.FooB;
class FooA {
FooB b = new FooB();
}
Bundle-B:
FooB.java:
package com.foo.b;
import com.foo.c.FooC;
class FooB {
public FooC foo() {
...
}
}
Bundle-C: ...
Kurz gesagt, ich habe 3 Bündel - A, B und C.
Bündel A Referenzen Bündel B direkt, und Bündel B Referenzen C. Wie Sie sehen, verwendet FooA nicht die Methode in FooB, die FooC zurückgibt, so FooC wird nicht direkt in Bundle A referenziert.
Warum ist BND inklusive OSGi-Import-Paket zu com.foo.c? So wie ich es verstehe - Bündel A braucht nur Bündel B, um sich selbst auflösen zu können. Bündel B hingegen braucht C. Aber warum sollte A C direkt benötigen, wenn es dort nicht gebraucht wird?
Okay, ich verstehe die Idee mit der Einführung der Schnittstelle. Aber ich suche keine Lösung für dieses spezielle Problem. Was ich versuche, ist, das Problem zu verstehen - warum nimmt BND dieses Paket auf? Wird das Paket wirklich benötigt? Wenn ich den Import manuell lösche, würde dies das Classloading unterbrechen? Warum? A verwendet C nicht direkt ... – mdzh
Es kommt darauf an, ob Java C benötigt, um Klasse A zu instanziieren oder in Ihrem Fall zu verwenden. Es wäre interessant zu sehen, was passiert, wenn Sie den Import entfernen. Wenn es noch funktioniert, kann vielleicht bnd verbessert werden, aber im Allgemeinen ist es ziemlich genau. Noch sollten Sie wirklich versuchen, Schnittstellen und Dienstleistungen zu benutzen ... es ist die einzige Weise, Ihre Module wirklich zu entkoppeln. –