Come posso collegare nuovi JAR implementando un'interfaccia dinamicamente?

6

Sfondo rapido: sto lavorando allo sviluppo di un'interfaccia che verrà implementata da me stesso e da altri sviluppatori. Questa interfaccia consentirà agli utenti di "plug-in" un nuovo codice funzionale in un sistema per un nuovo utilizzo. Questo nuovo codice verrà chiamato da un server / applicazione già in esecuzione. (TLDR: Ho bisogno di sviluppare la possibilità di installare plug-in nella mia applicazione al volo)

Tutto il lavoro che ho fatto finora con le interfacce è stato per scopi di codifica interna, non per essere esposto all'esterno. L'unico modo in cui posso pensare di consentire agli utenti di collegare nuove interfacce di implementazione del codice, è che l'utente possa in qualche modo agganciare un file JAR nel contenere la classe di implementazione e in qualche modo definire la sua firma di classe per la chiamata. Questo sembra qualcosa che è stato fatto prima, non sono mai stato esposto nel lato del codice di esso.

Esiste un framework che potrei utilizzare per consentire questo plug-in del nuovo codice Java durante il runtime server / applicazione? Ho già usato le API, ma in più del servizio web che mostra il senso in cui stai consumando un servizio e non "implementando" un'interfaccia di base.

Per riferimento sto usando un back-end Java, con Spring per l'applicazione principale.

    
posta Walls 28.03.2016 - 15:05
fonte

1 risposta

3

Dopo aver esaminato un post relativo su Stack Overflow , I ho trovato che ci sono una varietà di strumenti diversi a mia disposizione per fare lo sviluppo in stile "plugin".

In primo luogo, ero vicino a "API" ma la soluzione corretta è una "SPI" o interfaccia del fornitore di servizi. Ho trovato un ottimo post che descrive la differenza on Stack Overflow . Riassumendo: l'API è un insieme di classi / interfacce / metodi che tu chiami e usi per raggiungere un obiettivo. Rispetto a un SPI che è un insieme di classi / interfacce / metodi che ESTENDI e IMPLEMENTA per raggiungere un obiettivo.

Ci sono molti modi in cui sto ancora cercando di trovare la soluzione giusta per me, ma sembra che usare la ClassLoader di Java o URLClassLoader sia la strada da percorrere. Oracle fornisce un ottimo tutorial su come implementare questo qui .

Ci sono molti strumenti là fuori che possono fornire supporto per questo come Apache Aries e OSGi .

    
risposta data 30.03.2016 - 15:02
fonte

Leggi altre domande sui tag