Newsgroup: it.comp.java
Titolo: package fuori e dentro i jar

ciao a tutti,
mi trovo in questa situazione:
ho una certa quantità di package, diciamo:
a
a.b
a.b.c
a.b.d
a.b.e
in un jar file. Chiamiamolo primo.jar.
Poi ho bisogno di mettere il package
a.b.e.f
Che quindi è un sottopackage di a.b.e in un altro jar file, secondo.jar.
Come faccio a fare in modo che una classe del primo file, ad esempio
contenuta in a.b possa accedere alle classi di a.b.e.f?
Non so il problema è chiaro, dovrei aggiugnere al classpath tutti e due i
file, ma non posso rispettare la gerarchia delle directory visto che tutte
le dir sono contenute in primo.jar!
Li metto nella stessa directory e gioco con i manifest in modo che le classi
sembrino al posto giusto? Boh! :)
Grazie!
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it

 le dir sono contenute in primo.jar!
[CUT]
Ovviamente dovrai avere entrambi i jar nel classpath.
Ma nella classe del primo jar hai messo l'import corretto?
Inviato da 
www.mynewsgate.net

 Ma nella classe del primo jar hai messo l'import corretto?
Non l'ho ancora fatto, volevo solo capire come fare.
La faccio più facile. Mettiamo che io abbia questa classe:
package a.b.c;
import a.b.c.d.*;
public class Uno {
 public static void main(String[] args) {
        new Due().metodo();
 }
}
------
package a.b.c.d;
public class Due {
 public void metodo() {
 }
}
nel filesystem ho:
./a/b/c/Uno.class
./a/b/c/d/Due.class
creo un jar: primo.jar ci metto:
./a/b/c/Uno.class
e come classpath metto .
poi credo secondo.jar ci metto:
d/Due.class
e come classpath metto ../../../
alla fine di tutto questo casino ho:
./primo.jar
./a/b/c/secondo.jar
(visto che secondo.jar ingloba d)
se faccio:
java -classpath primo.jar:a/b/c/secondo.jar a.b.c.Uno
che speranza ho di vedere il mio codice eseguito correttamente? E come
dovrei fare?  


 dovrei fare?  
Forse così è un po' meno incasinato! 
Inviato da 
www.mynewsgate.net

 Non l'ho ancora fatto, volevo solo capire come fare.
Se capisco bene, non c'e' problema. Al classloader di sistema non interessa 
particolarmente dove una directory stia, ma solo che la corrispondenza 
directory/package sia corretta.
Puoi addirittura dividere lo stesso package in due jar, e anche avere 
classi duplicate (anche se e' uno dei modi migliori di garantirsi un futuro 
mal di testa, dato che la classe usata dipende dall'ordine in cui i jar 
sono dichiarati in classpath :).
Quindi, per esempio,
jar1: contiene a.b (cioe' ha una "zip directory" a/b che "contiene" le 
classi del package a.b)
jar2: contiene a.b.c (cioe' ha una "zip directory" a/b/c che "contiene" le 
classi del package a.b.c)
-- 
You dont know what to do when you dont know what you're doing.
http://space.tin.it/computer/csadun

 classi del package a.b.c)
E' esattamente quello che vorrei fare, perché immagino una struttura del
genere:
./applicazione/filePrincipale.jar
./applicazione/plugin/plugin1.jar
./applicazione/plugin/plugin2.jar
...
./applicazione/plugin/pluginN.jar
e pensavo di chiamare con una cosa tipo:
java -cp ./applicazione/filePrincipale.jar:./applicazione/plugin/*.jar
MainClass
Ti prego dimmi che posso mettere *.jar nel classpath, altrimenti non so come
fare :)
Dovrei poter caricare i jar dinamicamente come le librerie in codice nativo.
Come si fa?
Grazie!


 
Questo e' un problema diverso. In generale puoi usare un classloader 
dinamico (ad esempio, 
http://sadun-
util.sourceforge.net/api/org/sadun/util/DynamicClassLoader.html
) ma siccome 
ogni classloader e' oggidi' associato ad un dominio di sicurezza la cosa 
puo' portare a complicazioni.
Comuqnue val la pena provare: mettin l'applicazione + le necessarie 
interfacce implementate dai plugin in un jar, e usi un classloader dinamico 
per caricare i plugin stessi.
