Tengo una clase con dependencias que deseo implementar en caliente sin reiniciar las dependencias. La clase tiene una interfaz, pero solo hay una implementación concreta.¿Hay paquetes OSGI separados para api y práctica común de implementación?
Inicialmente, creé un paquete único con la interfaz exportada y registré la implementación utilizando el activador y las clases de implementación que no se exportaron. Sin embargo, si actualizo el paquete, los paquetes que usan el servicio registrado se reinician después de la actualización cuando se llama a PackageAdmin # refreshPackages (esto es automático cuando se usa la instalación de archivos).
He solucionado esto creando un paquete api por separado.
¿Es esta la mejor manera de lograrlo?
¿Alguna vez tendrá un paquete que exporte su API e incluya la implementación en el mismo paquete? Por lo que puedo ver, cualquier conjunto de datos podría exportar todas sus clases o no tener clases. ¿Qué me estoy perdiendo?
Estoy de acuerdo al 100% con esta respuesta, pero me gustaría hacerlo un poco más explícito. En un mundo OSGi ideal, solo hay 2 tipos de paquetes. Uno contiene * pure API * (es decir, solo interfaces y excepciones) y estos paquetes se exportan. El otro tipo de paquete es el paquete de implementación y exporta * nada *, utilizando servicios para interactuar con otros paquetes. Tenga en cuenta que, en muchos casos, es bastante aceptable fusionar varias API en un solo paquete. –