Domanda

Voglio creare un programma Java che possa essere esteso con plugin.Come posso farlo e dove devo cercare?

Ho una serie di interfacce che il plugin deve implementare e dovrebbe essere in un barattolo.Il programma dovrebbe cercare nuovi jar in una cartella relativa (al programma) e registrarli in qualche modo.


Anche se mi piace Eclipse RCP, penso che sia troppo per le mie semplici esigenze.

La stessa cosa vale per Spring, ma visto che avevo intenzione di dargli comunque un'occhiata, potrei anche provarlo.

Tuttavia, preferirei trovare un modo per creare il mio "framework" di plugin nel modo più semplice possibile.

È stato utile?

Soluzione

L'ho fatto per il software che ho scritto in passato, è molto utile.L'ho fatto creando prima un'interfaccia che tutte le mie classi di "plug-in" dovevano implementare.Ho quindi utilizzato Java ClassLoader per caricare quelle classi e crearne istanze.

Un modo in cui puoi farlo è questo:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

La classe è stata caricata, ora devi crearne un'istanza, assumendo che il nome dell'interfaccia sia MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();

Altri suggerimenti

Guardare dentro OSGi.

Da un lato, OSGi fornisce tutti i tipi di infrastruttura per gestire, avviare e fare molte altre cose con componenti software modulari.D'altra parte, potrebbe essere troppo pesante per le tue esigenze.

Per inciso, Eclipse utilizza OSGi per gestire i suoi plugin.

Ti consiglio di dare un'occhiata da vicino l'API Java Service Provider (SPI)..Fornisce un sistema semplice per trovare tutte le classi in tutti i Jar sul percorso di classe che si espongono come implementanti di un particolare servizio.L'ho usato in passato con sistemi plugin con grande successo.

Anche se sostengo la soluzione accettata, se è necessario il supporto di un plugin di base (che è il caso nella maggior parte dei casi), c'è anche il Struttura dei plugin Java (JPF) che, sebbene privo di documentazione adeguata, è un'implementazione del framework di plugin molto accurata.

È facilmente distribuibile e, una volta superate le idiosincrasie del caricamento delle classi, è molto facile da sviluppare.Un commento a quanto sopra è tenere presente che i percorsi di caricamento dei plugin sotto la directory dei plugin devono avere il nome di pieno classpath oltre ad avere i suoi file di classe distribuiti in un normale percorso del pacchetto denominato path.Per esempio.

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class

Con l'approccio del classloader sviluppato internamente:Sebbene sia sicuramente un buon modo per conoscere i classloader, esiste qualcosa chiamato "classloader hell", conosciuto soprattutto dalle persone che hanno lottato con esso quando si tratta di utilizzarlo in progetti più grandi.Le classi in conflitto sono facili da introdurre e difficili da risolvere.

E c’è una buona ragione per cui Eclipse è passato a OSGi anni fa.Quindi, se è più di un progetto per animali domestici, dai uno sguardo serio a OSGi.Vale la pena guardarlo.Imparerai a conoscere i classloader INOLTRE uno standard tecnologico emergente.

Hai preso in considerazione l'idea di basarti sulla Rich Client Platform di Eclipse e di esporre quindi il framework di estensione di Eclipse?

Inoltre, a seconda delle tue esigenze, Spring Framework potrebbe aiutarti con questo e altre cose che potresti voler fare: http://www.springframework.org/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top