Cómo crear un programa Java pluginable?


Quiero crear un programa Java que se pueda ampliar con plugins. ¿Cómo puedo hacer eso y dónde debo buscar?

Tengo un conjunto de interfaces que el plugin debe implementar, y debería estar en un jar. El programa debe buscar nuevos jars en una carpeta relativa (al programa) y registrarlos de alguna manera.


Aunque me gusta Eclipse RCP, creo que es demasiado para mis necesidades simples.

Lo mismo va para la primavera, pero ya que iba a mirarla de todos modos, también podría intentarlo.

Pero aún así, preferiría encontrar una manera de crear mi propio plugin "framework" tan simple como sea posible.

Author: Kev, 2008-08-25

6 answers

He hecho esto para el software que he escrito en el pasado, es muy útil. Lo hice creando primero una Interfaz que todas mis clases de' plugin ' necesitaban implementar. Luego usé Java ClassLoader para cargar esas clases y crear instancias de ellas.

Una forma de hacerlo es esta:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

Que ha cargado la clase, ahora necesita crear una instancia de la misma, asumiendo que el nombre de la interfaz es MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();
 40
Author: Steve M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-26 05:23:57

Mira en OSGi.

Por un lado, OSGi proporciona todo tipo de infraestructura para administrar, iniciar y hacer muchas otras cosas con componentes de software modulares. Por otro lado, podría ser demasiado pesado para tus necesidades.

Por cierto, Eclipse usa OSGi para administrar sus plugins.

 17
Author: David Koelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-25 14:09:53

Le recomiendo que eche un vistazo de cerca a la API de Java Service Provider (SPI) . Proporciona un sistema simple para encontrar todas las clases en todos los Jars en el classpath que se exponen como implementando un servicio en particular. Lo he utilizado en el pasado con sistemas de complementos con gran éxito.

 15
Author: jsight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-26 05:23:09

Aunque secundaré la solución aceptada, si se necesita un soporte básico de plugin (que es el caso la mayor parte del tiempo), también está el Java Plugin Framework (JPF) que, aunque carece de documentación adecuada, es una implementación de plugin framework muy ordenada.

Es fácil de implementar y, cuando se supera la idiosincrasia de carga de clases, es muy fácil de desarrollar. Un comentario a lo anterior es tener en cuenta que plugin loadpaths debajo del directorio plugin debe ser nombrado después del completo classpath además de tener sus archivos de clase desplegados en una ruta de paquete normal llamada ruta de acceso. Por ejemplo,

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class
 6
Author: Steen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-20 21:47:15

En el enfoque casero de classloader: Si bien es definitivamente una buena manera de aprender sobre classloaders, hay algo llamado "classloader hell", conocido principalmente por personas que lucharon con él cuando se trata de usarlo en proyectos más grandes. Las clases conflictivas son fáciles de introducir y difíciles de resolver.

Y hay una buena razón por la que eclipse se mudó a OSGi hace años. Entonces, si es más que un proyecto favorito, eche un vistazo serio a OSGi. Vale la pena mirar. Aprenderás sobre classloaders MÁS un estándar tecnológico emergente.

 4
Author: Toni Menzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-13 07:30:06

¿Ha considerado construir sobre la plataforma de Clientes Enriquecidos de Eclipse y luego exponer el marco de extensión de Eclipse?

También, dependiendo de sus necesidades, el Framework Spring podría ayudar con eso y otras cosas que podría querer hacer: http://www.springframework.org /

 1
Author: John with waffle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-24 23:38:08