Il modo migliore per costruire un sistema di plugin con Java


145

Come implementeresti un sistema plug-in per la tua applicazione Java?

È possibile avere un sistema facile da usare (per lo sviluppatore) che ottenga i seguenti risultati:

  • Gli utenti inseriscono i loro plugin in una sottodirectory dell'app
  • Il plugin può fornire una schermata di configurazione
  • Se si utilizza un framework, la licenza è compatibile con lo sviluppo commerciale?

Risposte:


107

Per prima cosa hai bisogno di un'interfaccia che tutti i plugin devono implementare, ad es

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Gli autori dei plugin dovrebbero quindi raggruppare i loro plugin in file JAR. Le applicazioni aprono il file JAR e potrebbero quindi utilizzare un attributo del manifest JAR o l'elenco di tutti i file nel file JAR per trovare la classe che implementa l'interfaccia del plug-in. Crea un'istanza per quella classe, il plugin è pronto per partire.

Ovviamente potresti anche voler implementare un qualche tipo di sandboxing in modo che il plugin sia limitato in ciò che può e non può fare. Ho creato una piccola applicazione di prova (e ho scritto sul suo blog ) composta da due plugin, uno dei quali non ha accesso alle risorse locali.


2
la sandbox di cui parli è in realtà la parte più difficile! ma non agitarti - osgi lo fa già per te come menzionato sopra.
Chii,

1
Il sandboxing non è poi così difficile. Mi ci sono voluti circa due settimane per scoprire come farlo correttamente, ma una volta che sai che è abbastanza semplice. :)
Bombe,

@Bombe questa applicazione di esempio è ancora viva ovunque?
ataulm,


@ timberwo7ves Non capisco cosa intendi. L'applicazione di test dei file può ancora essere scaricata dalla posizione indicata nel post e dalla pagina menzionata.
Bombe,

41

Usa OSGi .

È il fondamento del sistema di plug-in Eclipse. Equinox è l'implementazione di Eclipse (licenza EPL) e Felix è l'implementazione del progetto Apache (licenza pubblica Apache con licenza).

Eclipse fornisce un esempio concreto del fatto che OSGi può coprire i punti che hai citato (o potresti semplicemente compilare la tua applicazione sopra Eclipse RCP se vuoi uno stack completo Eclipse / SWT / JFace).


4
Mi sono dilettato con OSGi ma non ho mai trovato un buon primer per questo. Sarebbe bello se qualcuno potesse consigliare alcuni link qui.
Brian Matthews,

1
Ho incorporato l'equinozio nella mia applicazione e ho usato le pratiche OSGi standard per fare esattamente ciò che l'OP vuole. Anche in altalena, non SWT. Anche webstart. buona risorsa iniziale: neilbartlett.name/blog
basszero

3
OSGi è idealmente il sistema di plugin di fatto. Tuttavia, il salto dal modello di programmazione standard Java a OSGi è piuttosto ampio ...
Hendy Irawan,

30

Dall'1.6 esiste java.util.ServiceLoader che può essere utilizzato se si desidera codificare il proprio sistema semplice.

Ma se vuoi qualcosa di più delle funzionalità di base, usa uno dei framework esistenti.


16

Qualcuno qui ha usato JPF? Sembra interessante
Sven Lilienthal,

1
JabRef utilizza JPF per i suoi plugin. Funziona abbastanza bene.
koppor,

Sto usando JPF, ma è strettamente accoppiato con Ant. Voglio liberarmene, ma non so quanto impatto avrà sulla mia applicazione.
MartinL,

Ho creato un plugin JPF per un prodotto open source (OpenEMM); Sono stato in grado di farlo con maven (plugin maven-assembly); Sicuramente apprezzo molto la semplicità dello sviluppo, anche adesso è probabilmente l'OSGI ad essere più popolare.
рüффп,

Esistono restrizioni sulle versioni Java per l'utilizzo di JPF?
Madhav,

16

Usa PF4J . Ha il supporto per Web, Spring e Wicket. Facile da usare e costruire le applicazioni


trovo che questo sia quello di cui ho bisogno e sembra essere abbastanza semplice ma ho bisogno di aiuto
nonybrighto

prova a fare domande a Decebal su github. ti aiuterà
Daniel Jipa,

vedi meta.stackoverflow.com/questions/376686/… sullo stato dell'account Decebals qui
Wolfgang Fahl

1
Se stai guardando pf4j, potresti anche dare un'occhiata a github.com/hank-cp/sbp . È basato su pf4j per supportare Spring Boot per creare un'applicazione Web completa.
Hank,

13

Ho lavorato su OSGi per una settimana - una settimana intensa, nient'altro che OSGi. Alla fine è stato come un brutto sogno, ma ho imparato molto.

Sono stato in grado di far funzionare OSGi (non facile, tutti gli esempi sono obsoleti, tutto in rete ha almeno tre anni se non cinque), ma ho avuto seri problemi a integrarlo in un progetto esistente a causa di problemi con il si manifesta il barattolo.

In breve, ci sono solo pochi strumenti oscuri utilizzati per la creazione di manifesti e non sono ben documentati (BND Tools è quasi oscuro, ma è progettato per un certo processo in Eclipse). Inoltre, la maggior parte delle informazioni disponibili su OSGi non è destinata agli sviluppatori di applicazioni che dispongono di un'applicazione desktop esistente.

Questo rende gran parte del contesto per l'informazione confusa o inappropriata. I post sul blog di Neil Bartlett sono stati di grande aiuto, ma anche quelli non sono riusciti a ottenere un sistema funzionante (ho preso un po 'di codice dal tutorial di Felix e l'ho messo insieme per far girare il framework incorporato). Ho trovato la bozza del suo libro che ha pubblicato gratuitamente anni fa, il che è eccellente, ma gli esempi in Eclipse non funzionano a causa dei cambiamenti nel supporto OSGi di Eclipse.

Ogni passo è un grosso ostacolo. Proverò a pubblicare qualche dettaglio in più qui.


17
Come è una risposta? È più irritante di OSGi e non stai nemmeno spiegando cosa sia OSGi.
Rabbino

@StealthRabbi Al momento di questa "risposta", e per qualche tempo in seguito, era una buona informazione per qualcuno che cercava di lavorare con OSGi in libertà. OSGi faceva già parte della discussione, quindi non era necessario definirla. È una risposta in quanto potrebbe aver salvato le persone una settimana di lavoro, il motivo principale della SO.
Sean Anderson,

9

Penso che raccomandare OSGi per risolvere il problema sopra menzionato sia un consiglio estremamente scarso. OSGi è "la scelta giusta", ma per uno scenario come quello sopra, penso che sia JPF o un quadro minimalista nostrano sia sufficiente.


3

Anni fa ho iniziato un progetto del genere e spero che presto sarà pronto. Mi sono ispirato a progetti come NetBeans ed Eclipse ma nel frattempo è cambiato in qualcosa di leggermente diverso. OSGi sembra una buona scelta ora, ma non ho avuto la possibilità di confrontarlo con il mio progetto.È simile a JPF sopra menzionato, ma allo stesso tempo diverso in molti modi.

L'idea di base che mi ha motivato è quella di essere il più semplice possibile per creare un'applicazione Java, senza alcuna separazione tra applicazioni web, applicazioni desktop o applet / applicazioni JWS (ovviamente questo non copre ancora l'interfaccia utente) come funzionalità principale.

Ho costruito il progetto con alcuni obiettivi in ​​mente:

  • non importa se si crea un'applicazione Web o un'applicazione desktop, è necessario avviare l'applicazione allo stesso modo, un metodo principale semplice, nessuna dichiarazione web.xml di fantasia (non che io sia contrario ad avere un descrittore web standard, ma non va bene con un sistema plug-in, in cui aggiungi "servlet" - li chiamo RequestHandler (s) - dinamici a tuo piacimento).
  • è facile collegare "estensioni" attorno a un "punto di estensione", qualcosa di Eclipse ma con un approccio diverso.
  • auto-distribuibile, poiché tutti i plug-in sono registrati (file XML), l'applicazione deve essere auto-distribuibile indipendentemente dal sistema di compilazione - ovviamente c'è un'attività Ant e un Maven MOJO che sono i collegamenti con il nostro mondo, ma nel fine chiama l'applicazione e le indica di auto-distribuirsi in una posizione specifica.
  • preso in prestito da Maven, può scaricare il codice dai repository (inclusi i repository Maven 1 e 2) in modo che la tua applicazione possa essere distribuita come un singolo barattolo a condizione che tu abbia accesso ai repository (utile qualche volta, e sostanzialmente questo fornisce supporto per l'auto- aggiornamenti - non ti piace l'idea di essere avvisato dalla tua applicazione web che esiste una versione più recente, è stata scaricata e ha solo bisogno del tuo permesso per installarla? So che lo adoro).
  • monitoraggio delle applicazioni di base sullo stato del sistema, notifiche e-mail in caso di guasti

2
Non voglio assillare, ma ci hai lavorato da allora? Il codice è disponibile (potrei essere in grado di usarlo così com'è o aggiungerlo ad esso)?
Piccolo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.