Newsgroup: it.comp.java
Titolo: caricare jar a runtime

Ragazzi ci sto diventanto scemo dietro a sta cosa...Possibile che sia
così complicato? Ho seguito moltissime guide in rete in cui si
suggerisce di usare la reflaction e chessloader ma non mi
funziona...immancabilmente mi dà class not found. C'è qualche anima
pia che mi dice come è possibile caricare un jar a runtime senza dover
necessariamente mettere il jar nella cartella del classpath?
Grazie a chi mi vorrà rispondere.Saluti.

Giuseppe Silvestri ha scritto:

cerca fatjar
L'ho usato tempo fa per risolvere il problema delle swt e mi ricordo che 
ha funzionato, però ormai non ricordo più come :)
C'è anche un plugin per eclipse

il 06/03/2009 15.45, Scrive Giuseppe Silvestri 43844280:

Non so a cosa possa servirti, comunque...
Devi crearti un tuo classloader e rendere publico un metodo che richiami 
defineClass di ClassLoader (il metodo e' protected final e quindi non ci 
si puo' fare l'override) ed usare quello per caricare il file .class 
estratto dal jar. Che potrebbe essere (ad esclusione della parte di 
lettura del jar:
public class Carica {
   class Cloader extends ClassLoader {
     public Cloader(ClassLoader cl) {
       super(cl);
     }
     public Class cLoad(String name, byte[] b,int off, int len) {
       return super.defineClass(name, b, off, len);
     }
   }
   public static void main(String[] args) {
     try {
       File fc = new File("package/Classe.class");
       FileInputStream in = new FileInputStream(fc);
       byte[] b = new byte[(int)fc.length()];
       in.read(b);
       Cloader cl =
         new Carica().new Cloader(ClassLoader.getSystemClassLoader());
       Class c = cl.cLoad(nomelasse, b, 0, b.length);
       Constructor cc = c.getConstructor(new Class[] {String.class});
       Object co = cc.newInstance(new Object[] {"pippo"});
       System.out.println(c.getName());
       System.out.println(co);
     } catch (Exception e) {
       e.printStackTrace();
     }
   }
}
Il problema e' che qualsiasi classe sia refereziata nella classe che 
carichi che non sia gia' conosciuta dal classloader "standard" dovra' a 
sua volta essere risolta dal tuo classloader.
Mi sembra un gioco che duri parecchio! :-))
-- 
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'

il 06/03/2009 17.33, Scrive Motosauro 43694240:

Il fatjar mi sembra che faccia un'altra cosa. Per quanto possa aver 
capito l'op vorrebbe caricare a runtime le classi di un jar non definito 
quando in precedenza. Il fatjar include le classi necessarie ad un 
progetto nell'esportazione del jar del progetto stesso.
Eventualmente potrebbe ispirarsi al classloader di one-jar, che a mio 
avviso sposa meglio le esigenze dell'op.
Rimane comunque il fatto che utilizzare una classe non conosciuta in 
fase di progettazione mi sembra arduo.



Poi provo il tuo codice e ti dico se funziona. Il problema è che uso
un file jdom.jar per l' analisi di un documento xml che non è
contenuto tra le librerie standard del jre per cui devo referenziarlo
a runtime ma finora anche usando metodi analoghi al tuo (almeno
concettualmente) non sono riuscito. Non c'è altro modo di farlo? La
mia applicazione è una applet firmata e nel metodo init copio questo
file in una cartella del pc host. Non posso modificare in qualche modo
il classpath del pc host facendolo puntare al file jar (di cui la
locazione è fissa) e basta?
Grazie, saluti

 locazione è fissa) e basta?
No, il classloader che utilizzi a runtime, ovvero 
ClassLoader.getSystemClassLoader(), viene attivato quando parte la jvm, 
ed e' per questo che devi utilizzare un classloader creato ad-hoc per 
risolvere in seguito le classi non presenti nel classpath iniziale.


 schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'
Poi provo nell' altro modo anche perchè cosi mi dà come errore
incompatible magic value nella classe SAXbuilder :-(.
Il codice adattato è il seguente: faccio presente che il percorso
completo di SAXBuilder.class è da import org.jdom.input.SAXBuilder;
public class Carica
{
	class Cloader extends ClassLoader
	{
		public Cloader(ClassLoader cl)
		{
			super(cl);
		}
		public Class cLoad(String name, byte[] b, int off, int len)
		{
			return super.defineClass(name, b, off, len);
		}
	}
	public static void main(String[] args)
	{
		try
		{
			File fc = new File("C:/dllAppletTalk/jdom.jar");
			FileInputStream in = new FileInputStream(fc);
			byte[] b = new byte[(int)fc.length()];
			in.read(b);
			Cloader cl =
			new Carica().new Cloader(ClassLoader.getSystemClassLoader());
			Class c = cl.cLoad("SAXBuilder", b, 0, b.length);
			Constructor cc = c.getConstructor(new Class[] { String.class });
			Object co = cc.newInstance(new Object[] { "pippo" });
			System.out.println(c.getName());
			System.out.println(co);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
Sbaglio qualcosa?
Grazie ancora. Saluti


Grazie mille a tutti e due ho utilizzato fatjar ed ho risolto almeno
questo problema anche se ho ancora qualche nodo da sciogliere.
Comunque se volete vedere l' applicazione (incompleta...) potete
vederla nella home-page del mio sito
www.thenumberone.it
Si tratta del chatterbot in alto a destra. Ditemi anche se riscontrate
qualche problema.
Grazie ancora. Saluti.

 wrote in message 
news:4fdaec2b-05e1-42ce...@c36g2000yqn.googlegroups.com...


 Grazie ancora. Saluti
