2015-08-25 10 views
5

Ho svolto ricerche su come sviluppare un'applicazione in grado di caricare plug-in. Finora, ho visto che questo può essere fatto definendo un'interfaccia e che i plugin la implementino.Sviluppo dell'applicazione con il supporto del plugin in Java

Tuttavia, il mio problema attuale è su come caricare i plugin quando sono imballati in Jars. Esiste un modo "migliore" per farlo?

La logica corrente che sto pensando è di ottenere ogni plug-in e all'interno del proprio Jar cercare la classe che implementa l'interfaccia. Ma non so come fare una simile ricerca. Penso che questa logica potrebbe non essere buona, ma non sono riuscito a trovare alcuna informazione utile su questo argomento specifico.

** Edit1: ** aggiungere più informazioni: I plugin destinati sarebbe file Jar contenuti in una sottodirectory dove sarebbe situato Jar dell'applicazione principale, come questo:

cartella Application
| - Main_Application .jar
| - Plugin
    | - Plugin1.jar
    | - Plugin2.jar
    | - Steve's_plugin.jar

E così via.

Quello che mi aspetto è che l'applicazione sarà in grado di caricare tutti i plugin all'interno della cartella in fase di esecuzione. Quindi nel codice, sarebbe solo consapevole che la cartella del plugin dovrebbe esistere e ci dovrebbero essere dei Jars all'interno di tale cartella.

Diciamo che ho un'interfaccia plug-in come questo:

interface Plugin 
{ 
    public void run(); 
} 

Plugin sarebbe identificato da una classe che implementa tale interfaccia, in questo modo

class Plugin1 implements Plugin 
{ 
    //attributes and other methods 
    @override 
    public void run() 
    { 
     //something happens here 
    } 
} 

class Plugin2 implements Plugin 
{ 
    //attributes and other methods 
    @override 
    public void run() 
    { 
     //something happens here 
    } 
} 

La domanda deve essere compilato solo una volta, ed essere in grado di caricare qualsiasi plugin aggiunto alla cartella quando viene eseguito. Affinché l'Applicazione possa caricare qualsiasi Plugin, devo stabilire regole sul contenuto del Jar, come il nome del pacchetto e la classe che implementa l'interfaccia? O si prevede che la classe che implementa l'interfaccia del plugin possa trovarsi in qualsiasi pacchetto all'interno del Jar e avere un nome qualsiasi?

Questo è l'approccio più generico a ciò che mi piacerebbe fare con tali plugin. In breve, sto progettando di creare un'applicazione con schede e ogni plugin fornirà l'interfaccia e le funzionalità di ciascuna scheda. Sto provando questo perché voglio essere in grado di mantenere ogni scheda separatamente, e non voglio ricompilare l'intera applicazione a causa di cambiamenti in un solo componente che non influenzano affatto gli altri.

+0

Ecco come si caricano le classi da JAR: http://stackoverflow.com/questions/460364/how-to-use-classes-from-jar-files – cahen

+0

come per i "plug-in", è necessario fornire più informazioni su cosa sono realmente ed essere più specifici sul problema che si sta avendo, con il codice, se possibile – cahen

+0

Sì, sono questi plugin, o solo una raccolta di file di classe su un percorso? Vengono aggiunti al classpath predefinito o caricati indicando esplicitamente il percorso? –

risposta

2

ottenere l'elenco dei vasetti di plugin:

File[] jars = new File("Plugins").listFiles(); 

Quindi, utilizzare il codice da this answer about loading all classes from a JAR file, ma eseguirlo una volta per ogni file in jars il cui nome termina in ".jar".Nella parte inferiore del corpo del ciclo, dopo

Class c = cl.loadClass(className); 

continuare con

if (Plugin.class.isAssignableFrom(c)) { 
    Plugin plugin = (Plugin) c.newInstance(); 
    // And then, do something with the plugin here 
} 

Condivido @ preoccupazioni Mifeet sulla sicurezza - si potrebbe desiderare di utilizzare un SecurityManager per limitare ciò che il codice del plugin è permesso di fare .

+0

Grazie mille. Questo ha funzionato perfettamente. Informazioni sul codice attendibile, sono a conoscenza dei problemi di sicurezza e dovrei sandbox i plug-in. Ma prima volevo concentrarmi sul caricamento dei plug-in. – tady159