2008-08-24 13 views
30

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

Tengo un conjunto de interfaces que el complemento debe implementar, y debe estar en un contenedor. El programa debería buscar nuevas jarras en una carpeta relativa (al programa) y registrarlas de alguna manera.


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

Lo mismo ocurre con la primavera, pero dado que iba a verla de todos modos, podría intentarlo.

Pero igual, preferiría encontrar una manera de crear mi propio "framework" de plugin lo más simple posible.

+0

posible duplicado de [mejor manera de construir un sistema de plugins con Java] (http://stackoverflow.com/questions/465099/best-way-to-build-a-plugin-system-with-java) Esto es anterior, pero el otro se hizo más popular al final. –

Respuesta

37

He hecho esto para el software que he escrito en el pasado, es muy práctico . Lo hice creando primero una interfaz que todas mis clases de 'complemento' necesitaban implementar. Luego utilicé Java ClassLoader para cargar esas clases y crear instancias de ellas.

Una manera de hacerlo es la siguiente:

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 se ha cargado la clase, ahora lo que necesita para crear una instancia del mismo, asumiendo el nombre de la interfaz es MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance(); 
+0

Sé que llegué un poco tarde a este hilo, pero ¿qué pasaría si quisiera recorrer todas las clases dadas en un directorio y cargarlas? ¿Hay algún lugar en el que pueda ver una implementación y un código en línea? Aparte de eso, entiendo la mayor parte de tu código y es muy simple, ¡gracias! +1 –

+1

@CodyRichardson Hay un ejemplo completo de implementación simple en http://www.knowbase.org/viewtopic.php?id=31; hace uso de Java 8 y Gradle 4. – Alexiy

+0

@Alexiy Gracias por ese enlace, me ayudó mucho y es básicamente todo lo que necesitaba. Fue un poco complicado al principio (sobre todo las lambdas), pero eso es solo porque soy un novato de Java :) Lo busqué varias veces y tuvo mucho más sentido. ¡Gracias por eso! –

1

¿Ha considerado construir sobre la plataforma de cliente enriquecido de Eclipse, y luego exponer el marco de extensión de Eclipse?

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

14

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

+2

Tenga en cuenta que la clase sun.misc.Service ha sido reemplazada por la clase java.util.ServiceLoader. –

16

Mire 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.

Incidentalmente, Eclipse usa OSGi para administrar sus complementos.

+1

+1 para OSGi. Encuentro el tamaño correcto entre trickeries simples de ClassLoader (que te dejarán muchas ruedas para reinventar) y Eclipse RCP (gran marco para tareas no tan complejas). – Leonel

4

En el enfoque del cargador de clases de fabricación casera: Si bien es una buena forma de aprender sobre los cargadores de clases, hay algo llamado "infierno de cargadores de clases", conocido principalmente por personas que luchan con él cuando se trata de proyectos más grandes. Las clases en conflicto son fáciles de introducir y difíciles de resolver.

Y hay una buena razón por la cual el eclipse se movió a OSGi hace años. Entonces, si es más que un proyecto de mascota, eche un vistazo serio a OSGi. Vale la pena mirar Aprenderá sobre los clasificadores más un estándar emergente de tecnología.

6

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

Es fácil de implementar y, cuando se supera el idiosincraso de carga de clases, es muy fácil de desarrollar. Un comentario a lo anterior es tener en cuenta que los caminos de carga de complementos debajo del directorio de complementos deben tener el nombre del ruta de clase completa, además de tener sus archivos de clase desplegados en una ruta de paquete de paquete normal llamada ruta de acceso. P.ej.

plugins 
`-com.my.package.plugins 
    `-com 
    `-my 
     `-package 
     `-plugins 
      |- Class1.class 
      `- Class2.class 
Cuestiones relacionadas