Pregunta

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

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


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

Lo mismo ocurre con la primavera, pero como lo iba a ver de todos modos, podría intentarlo.

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

¿Fue útil?

Solución

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 'complementos' necesitaban implementar. Luego utilicé el Java ClassLoader para cargar esos 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

Eso ha cargado la clase, ahora necesitas crear una instancia de ella, asumiendo que el nombre de la interfaz es MyModule:

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

Otros consejos

Busque 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 complementos.

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

Aunque secundé la solución aceptada, si se necesita un complemento básico (que es el caso la mayoría de las veces), también está el Java Plugin Framework (JPF) que, aunque carece de la documentación adecuada, es una implementación de marco de complemento muy ordenada.

Es fácilmente desplegable y, cuando se superan las idiosincrasias de carga de clases, es muy fácil de desarrollar. Un comentario a lo anterior es tener en cuenta que las rutas de carga de complementos debajo del directorio de complementos deben nombrarse después de la ruta de clase completa además de tener sus archivos de clase implementados en una ruta de paquete normal llamada ruta. Por ejemplo,

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

En el enfoque de cargador de clase de cosecha propia: Si bien definitivamente es una buena manera de aprender sobre cargadores de clases, hay algo llamado `` infierno de cargadores de clases '', conocido principalmente por las personas que luchan con él cuando se trata de usarlo en proyectos más grandes. Las clases conflictivas son fáciles de presentar y difíciles de resolver.

Y hay una buena razón por la cual 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á sobre cargadores de clases MÁS un estándar tecnológico emergente.

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

Además, dependiendo de sus necesidades, Spring Framework puede ayudar con eso y otras cosas que puede hacer: http : //www.springframework.org/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top