¿Cómo puedo agregar nuevos JAR que implementen una interfaz dinámicamente?

7

Antecedentes rápidos: estoy trabajando en el desarrollo de una interfaz que será implementada por mí y otros desarrolladores. Esta interfaz permitirá a los usuarios "agregar" un nuevo código funcional a un sistema para un nuevo uso. Este nuevo código se llamará desde un servidor / aplicación que ya se está ejecutando. (TLDR: necesito desarrollar la capacidad de instalar complementos en mi aplicación sobre la marcha)

Todo el trabajo que he hecho con las interfaces hasta ahora ha sido para fines de codificación interna, no para ser expuesto al exterior. La única forma en que puedo pensar para permitir que los usuarios complementen nuevas interfaces de implementación de código sería que el usuario de alguna manera enganche un archivo JAR que contenga la clase de implementación y de alguna manera defina su firma de clase para la llamada. Esto parece algo que se ha hecho antes, simplemente nunca he estado expuesto al lado de la codificación.

¿Existe un marco que podría usar para permitir este complemento de código Java nuevo durante el tiempo de ejecución del servidor / aplicación? He usado API antes, pero en una mayor parte del servicio web expongo el sentido de que estás consumiendo un servicio y no "implementando" alguna interfaz central.

Como referencia, estoy usando un backend de Java, con Spring para la aplicación principal.

Paredes
fuente
1
Parece un duplicado de stackoverflow.com/questions/25449/…
Esben Skov Pedersen
@EsbenSkovPedersen que me llevó a una madriguera de conejo que finalmente me dio todo lo que necesitaba y algo más. Muchas gracias. (-admins: Duplicate, close está bien para mí)
Walls
Los duplicados de @Walls deben estar en el mismo sitio. El hecho de que SO tenga una pregunta similar no significa que esta sea un duplicado de la misma. Podría resumir lo que encontró en una respuesta a esta pregunta y vincularlo a la pregunta SO, ya que las respuestas son un poco más permanentes que los comentarios.

Respuestas:

5

Después de buscar en una publicación relacionada sobre Stack Overflow , descubrí que había una variedad de herramientas diferentes a mi disposición para hacer el desarrollo de estilo "plugin".

Primero, estaba cerca de "API" pero la solución correcta es un "SPI" o interfaz de proveedor de servicios. Encontré una muy buena publicación que describe la diferencia en Stack Overflow . Para resumir: API es un conjunto de clases / interfaces / métodos que usted LLAMA y UTILIZA para lograr un objetivo. En comparación con un SPI que es un conjunto de clases / interfaces / métodos que AMPLÍA e IMPLEMENTA para lograr un objetivo.

Todavía estoy buscando muchas maneras para encontrar la solución adecuada para mí, pero parece que usar Java ClassLoadero URLClassLoaderserá el camino a seguir. Oracle proporciona un excelente tutorial sobre cómo implementar esto aquí .

Existen muchas herramientas que pueden brindar soporte para esto, como Apache Aries y OSGi .

Paredes
fuente