2013-07-31 11 views
5

Considerando che sto sviluppando un programma software per l'utente finale (come un uberjar) mi chiedo quali sono le mie opzioni per rendere possibile all'utente di scaricare un plugin e caricarlo durante il runtime .Architettura per i plugin da caricare in runtime

I plug-in devono essere compilati e senza codice sorgente, quindi sth. come load non è un'opzione. Quali librerie esistenti (o modi di Java ...?) Esistono per costruire questo?

MODIFICA: Se non si è sicuri, anch'io sarei soddisfatto di un modo che costa un riavvio/avvio del programma principale. Tuttavia, l'importante è che il codice sorgente non sia incluso in nessun file JAR (né applicazione principale né plugin-jar, vedi: omit-source della documentazione di Leiningen).

risposta

1

Non l'ho provato da solo, ma in teoria dovresti riuscire a far funzionare con Clojure.

C'è una biblioteca/integrazione OSGi Clojure qui:

+0

Sembra che OSGi sia il modo Java per farlo. Il repository github è veramente scarsamente documentato e sembra altamente hackerato da uno sguardo al codice sorgente. Se non c'è nulla di simile, probabilmente scriverò un wrapper per OSGi da solo. –

1

Se dovessi tentare di ruolo la mia soluzione, vorrei provare a utilizzare tools.namespace per caricare e scaricare i plugin. Non sono del tutto sicuro che funzionerà, ma è certamente nella giusta direzione. Penso che un pezzo chiave sia che i jar del plugin dovranno essere "installati" in un percorso già presente sul classpath.

Ancora una volta, questo è solo l'inizio di una possibile soluzione. Non ho provato a farlo.

+0

Sei sicuro che tools.namespace.find funzioni quando il codice sorgente non è incluso nei JAR? –

+0

Non ho provato, ma il README afferma che tools.namespace.find contiene "utilità per cercare spazi dei nomi Clojure sul filesystem, nelle directory o nei file JAR. Combinato con java.classpath, può cercare spazi dei nomi sul classpath Java." – Jeremy

+0

Purtroppo non riesce a trovare spazi dei nomi in file JAR senza fonte :( –

4

Per aggiungere un jar durante il runtime, utilizzare pomegranate che consente di aggiungere un file .jar al classpath. Plugin del software dovrebbero essere librerie regolari Clojure che seguono certe convenzioni che è necessario stabilire:

  1. renderli forniscono (ad esempio in un edn) un simbolo ad un oggetto che implementa un meccanismo di costruttore/distruttore come il Lifecycle protocollo nella libreria component di Stuart Sierras. In runtime, require e resolve tale simbolo, start l'oggetto risultante e consegnarlo per riposare le strutture di coordinamento dei plugin dei programmi.

  2. Fornire un'API pubblica nel programma che consente ai plug-in di interagire con esso in modo da coordinare in modo asincrono e. g. con clojure.core.async (non lasciare che un plugin blocchi l'intero programma).

  3. Assicurarsi che i plug-in abbiano un modo coordinato per esporre le proprie funzionalità l'uno con l'altro solo se lo desiderano in modo da consentire un elevato grado di modularità tra i plug-in. Assicurati che il tuo caricatore di plugin sia in grado di rilevare dipendenze tra i plugin e sia in grado di caricarli e scaricarli nell'ordine corretto.