sort ejemplo java plugins osgi guice peaberry

ejemplo - Implementando complementos dinámicos en Java



sort arraylist object java (5)

Me gustaría implementar una función de complemento dinámico en una aplicación Java. Idealmente:

  • La aplicación definiría un Plugin interfaz con un método como getCapabilities() .
  • Un complemento sería un pluginX.jar JAR que contiene un PluginXImpl implementación PluginXImpl clase (y quizás algunos otros).
  • El usuario colocará pluginX.jar en un directorio especial o establecerá un parámetro de configuración que apunte a él. El usuario no necesariamente debe tener que incluir pluginX.jar en su classpath.
  • La aplicación encontraría PluginXImpl (tal vez a través del manifiesto JAR, tal vez por reflexión) y lo agregaría a un registro.
  • El cliente podría obtener una instancia de PluginXImpl , por ejemplo, invocando un método como getPluginWithCapabilities("X") . El usuario no necesariamente debe saber el nombre del complemento.

Tengo la sensación de que debería poder hacer esto con peaberry , pero no puedo entender la documentación. He invertido algo de tiempo en aprender Guice, por lo que mi respuesta preferida no sería "usar Spring Dynamic Modules ".

¿Alguien puede darme una idea simple de cómo hacer esto usando Guice / peaberry, OSGi o simplemente Java?



Discúlpese si lo sabe, pero eche un forName método forName de Class . Se utiliza al menos en JDBC para cargar dinámicamente las clases de controladores específicas de DBMS en tiempo de ejecución por nombre de clase.

Entonces supongo que no sería difícil enumerar todos los archivos de clase / jar en un directorio, cargar cada uno de ellos y definir una interfaz para un método estático getCapabilities() (o cualquier nombre que elija) que devuelva sus capacidades / descripción en cualquier lugar. Términos y formato que tienen sentido para su sistema.


En realidad, esto es bastante fácil usando medios Java simples:

Como no desea que el usuario configure la ruta de clase antes de iniciar la aplicación, primero crearía un URLClassLoader con una matriz de URL para los archivos en su directorio de complementos. Use File.listFiles para encontrar todos los archivos comprimidos de complementos y luego File.toURI (). ToURL () para obtener una URL para cada archivo. Debe pasar el cargador de clases del sistema (ClassLoader.getSystemClassLoader ()) como padre a su URLClassLoader.

Si los archivos adjuntos contienen un archivo de configuración en META-INF / services como se describe en la documentación de la API para java.util.ServiceLoader, ahora puede usar ServiceLoader.load (Plugin.class, myUrlClassLoader) para obtener un cargador de servicios para su interfaz Plugin y llame a iterator () para obtener instancias de todas las implementaciones configuradas de Complementos.

Todavía tiene que proporcionar su propio envoltorio para filtrar las capacidades de los complementos, pero supongo que eso no debería ser demasiado problemático.


La mejor manera de implementar complementos con Guice es con Multibindings . La página vinculada explica en detalle cómo usar multibindings para hospedar complementos.


OSGI estaría bien si desea reemplazar los complementos durante el tiempo de ejecución ig para correcciones de errores en un entorno 24/7. Jugué un tiempo con OSGI pero tomó mucho tiempo, porque no era un requisito, y necesitas un plan b si eliminas un paquete.

Mi solución más humilde entonces fue proporcionar un archivo de propiedades con los nombres de clase de las clases de descriptores de complementos y dejar que el servidor los llame para registrarse (incluyendo sus capacidades).

Esto es obviamente subóptimo, pero no puedo esperar a leer la respuesta aceptada.