Newsgroup: it.comp.java
Titolo: Plugin in Java

Forse l'argomento � banale, ma googlando un p� non ho trovato nulla, e 
quindi...
Sono nuovo di Java, vengo dal C++ e sto dando un'occhiata a un progetto 
preesistente in java. Vorrei creare un sistema di plugin per questo 
programma, un sistema che usi solo java e non anche la JNI o altre 
tecnologie: � possibile?
Vale a dire dei pezzi di codice che il programma principale, DOPO essere 
partito, va a cercare e carica se e quando gli servono.
In C++ uso delle DLL, ma da quello che ho potuto vedere finora di java, 
non esiste niente di simile: i package vengono caricati tutti all'avvio 
del programma e non si pu� "aggiungere" un package al programma dopo che 
questo � stato compilato.
Mi servirebbe, insomma, un analogo java delle DLL, cio� dei package 
caricabili dinamicamente... esiste una cosa del genere?

 caricabili dinamicamente... esiste una cosa del genere?
http://java.sun.com/docs/books/tutorial/reflect/

 
http://java.sun.com/docs/books/tutorial/reflect/
Visto. Sembra un p� macchinoso ma mi arranger�...

 Visto. Sembra un p� macchinoso ma mi arranger�...
Vorrei sapere che cosa *non �* macchinoso in Java...

Massimo Soricetti ha scritto:

Ciao,
le alternative sono molte. Ecco un breve elenco:
1. Il sistema di plugin della NetBeans RCP (
http://platform.netbeans.org/
)
2. Il sistema di plugin dell'Eclipse RCP (
www.eclipse.org
)
3. OSGi (che poi � quello su cui si basa Eclipse). 
(
http://www.osgi.org/About/HowOSGi
)
4. Impala (
http://platform.netbeans.org/
)
...probabilmente molti altri.
ah...in Java 7 ci sar� un maggior supporto per la modularizzazione 
dinamica...ma per ora bisogna arrangiarsi.
Ciao
   Lucio
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org

 dinamica...ma per ora bisogna arrangiarsi.
Bene, speremm che lo rilasciano presto...
Ho notato che sul sito di Java � nominata la VM java per win7/Vista a 64 
bit, ma il link per scaricarla non si trova.
E' una svista o � proprio che una VM a 64 bit non c'� ancora?

 E' una svista o � proprio che una VM a 64 bit non c'� ancora?
Boh, non uso Windows, ma dovrebbe esserci.
Da questa pagina, selezionando Windows x64, sono arrivato al download:
http://java.sun.com/javase/downloads/widget/jdk6.jsp


 questo � stato compilato.
in realt� questo non � vero. il meccanismo delle librerie dinamiche in 
java ce l'hai gratis perch� in java non esistono link statici, ovvero 
detto in altre parole le librerie sono tutte dinamiche. quindi va capito 
un attimo quello che vuoi fare, perch� alcune operazioni (come caricare 
una classe a runtime) sono "comprese nel prezzo", per altre � necessario 
e sufficiente capire come funzionano i classloader, mentre se vuoi 
effettivamente realizzare una architettura a plugin allora restano 
validissimi i link suggeriti da lucio benfante. per� � chiaro che una 
architettura a plugin � concettualmente pi� complessa del semplice uso 
di librerie dinamiche in c++, pu� darsi che la verit� stia nel mezzo :-)


Innanzitutto la parola package ha un significato ben preciso in java
(addirittura è una keyword) che non ha nulla a che fare con quello di
cui parli, per cui ti sconsiglio di usarla.
Tu vuoi
1) caricare dinamicamente delle librerie a runtime
2) eseguire del codice in esse
1) Nulla di più facile, non occorre far nulla se non mettere i .class
e i .jar che contengono il programma che vuoi caricare dinamicamente
nel classpath. Questo perché in java tutte le calssi sono caricate
dinamicamente, e solo al primo utilizzo.
2) Devi instanziare il codice ed eseguirlo. Un tutorial SEMPLICISSIMO
lo trovi 
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
(non capisco cosa ci sia di difficile nell'instanziare una classe via
reflection: basta scrivere Class.forName("NomeClasse").newInstance();
Un po' più complesso, se devi anche compilare il codice del plugin al
volo. Esistono dei package SUN allo scopo, ma sono ad uso interno per
cui non sono molto documentati. Piuttosto molti scrivono il bitecode
direttamente, usando librerie di manipolazione del bytecode, ma si
tratta di cose molto avanzate per cui te le accenno solo.
Tieni presente che se aggiungere codice a runtime è molto semplice,
MOLTO più complesso è sostituire il codice una volta che è caricato.
Per cui se devi permettere agli end users di scriversi i plugin, il
che presuppone uno sviluppo iterativo, può essere meglio dargli la
possibilità di scriverli anziché in Java puro, usando un motore di
scripting. Ce ne sono moltissimi che puoi integrare molto facilmente
in un programma java, e tutti molto validi. La differenza principale è
il linguaggio dal loro usato.
In ordine di (mia) preferenza: Groovy (javalike), Jython (python),
JRuby (ruby), Beanshell (javalike), Rhino (in javascript)
Usando un motore di scripting, puoi interfacciarti al tuo programma in
modo MOLTO semplice, e soprattutto permettere all'utente di modificare
il sorgente del plugin senza che debba riavviare il programma per
vedere le modifiche

 JRuby (ruby), Beanshell (javalike), Rhino (in javascript)
magari in un futuro...

 validissimi i link suggeriti da lucio benfante.
La terza che hai detto... vedi risposta ad Alessandro per un esempio

 file).
Se, come mi pare, � un'applicazione grafica, ti consiglierei di basarla 
sulla NetBeans RCP.


 magari in un futuro...
Io la terrei MOLTO in considerazione come strada. Tieni presente che
il fatto che siano integrati a livello di JVM potrebbe far si che
possono essere implementati in una mescolanza di java e il linguaggio
a tua scelta con percentuali arbitrarie (addirittura potresti anche
scrivere uno script che carica una classe java che implementa la tua
interfaccia e quindi la ritorna. Di fatto si tratta di una linea di
script e il resto in java..)
In aggiunta, su google code ho visto una lib MOLTO interessante che a
partire da una interfaccia è in grado di darti tutte le classi nel
classpath che la implementano. Non l'ho però personalmente provata...
http://code.google.com/p/reflections/
Ultima nota: scaricare le classi java da un URL remoto è cosa
abbastanza banale, basta caricarle con un URLClassLoader al posto di
quello standard. In internet ci sono molti esempi a riguardo