Como posso conectar novos JARs implementando uma interface dinamicamente?


7

Breve histórico: Estou trabalhando no desenvolvimento de uma interface que será implementada por mim e por outros desenvolvedores. Essa interface permitirá que os usuários "plugem" novo código funcional em um sistema para novo uso. Este novo código será chamado de um servidor / aplicativo já em execução. (TLDR: preciso desenvolver a capacidade de os plug-ins serem instalados no meu aplicativo em tempo real)

Todo o trabalho que fiz com as interfaces até agora tem sido para fins de codificação interna, para não ser exposto externamente. A única maneira de pensar para permitir que os usuários plugem novas interfaces de implementação de código seria para o usuário, de alguma forma, conectar um arquivo JAR contendo a classe de implementação e, de alguma forma, definir sua assinatura de classe para chamada. Parece algo que já foi feito antes, mas nunca fui exposto ao lado da codificação.

Existe uma estrutura que eu poderia usar para permitir esse plug-in do novo código Java durante o tempo de execução do servidor / aplicativo? Eu já usei APIs antes, mas em mais serviços da Web, expõe sentido em que você está consumindo um serviço e não "implementando" alguma interface principal.

Para referência, estou usando um back-end Java, com Spring para o aplicativo principal.



@EsbenSkovPedersen que me levou a uma toca de coelho que acabou me dando tudo o que eu precisava e mais um pouco. Muito obrigado. (-admins: Duplicate, perto é bem por mim)
Paredes

As duplicatas do @Walls devem estar no mesmo site. Só porque o SO tem uma pergunta semelhante não significa que essa seja uma duplicata. Você pode resumir o que encontrou em uma resposta a esta pergunta e vincular à pergunta SO, pois as respostas são um pouco mais permanentes que os comentários.

Respostas:


5

Depois de examinar um post relacionado no Stack Overflow , descobri que havia uma variedade de ferramentas diferentes à minha disposição para fazer o desenvolvimento do estilo "plugin".

Primeiro, eu estava perto da "API", mas a solução correta é uma "SPI" ou Interface do provedor de serviços. Encontrei um post muito bom descrevendo a diferença no Stack Overflow . Para resumir: API é um conjunto de classes / interfaces / métodos que você CHAMA e USE para atingir uma meta. Comparado a um SPI, que é um conjunto de classes / interfaces / métodos que você ESTENDE e IMPLEMENTA para atingir uma meta.

Ainda estou procurando muitas maneiras de encontrar a solução certa para mim, mas parece que usar o Java ClassLoaderou URLClassLoaderserá o caminho a seguir. A Oracle fornece um ótimo tutorial sobre como implementar isso aqui .

Existem muitas ferramentas por aí que podem fornecer suporte para isso, como o Apache Aries e o OSGi .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.