|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
[Java] estrarre dal proprio JAR
immaginiamo di poter dare per scontato che un programma Java sia stato compresso in un file JAR assieme ad alcune risorse che dovrà utilizzare (facciamo delle immagini). i problemi che vedo sono principalmente due:
1) come ottenere il path del proprio file JAR 2) come estrarre dal JAR (questo è un problema solo mio, nel senso che so che si può fare a non so come ^^) ed infine aggiungiamo anche un terzo problema: 3) esiste una maniera più semplice/diretta/affidabile? per esempio, in Win32 per caricare delle risorse dal proprio eseguibile non c'è mica bisogno di sapere il nome del file e di aprirlo a parte... |
![]() |
![]() |
![]() |
#2 | |
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Quote:
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
pare faccia al caso mio, però parla di risorse associate ad una classe; come si associa una risorsa ad una classe? una risorsa associata ad una classe può stare anche dentro un JAR?
lavoro con Eclipse e quando esporto i JAR mi permette di includervi anche cartelle non contenenti files binari .class. io ho messo tutte le mie immagini in una cartella "gfx", che nel filesystem si trova allo stesso livello delle cartelle "src" e "bin" in cui Eclipse mette di default i sorgenti e i binari (rispettivamente), quindi come procedo esattamente? va bene includere "gfx" nel JAR o devo includere separatamente le immagini in qualche altro modo? cosa passo poi di preciso a getResource(AsStream)? altra domanda: vedo che getResource mi restituisce un URL... sarebbe l'URL di cosa? ![]() ![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
Il path non è altro che il percorso della risorsa espresso in termini di package. Per esempio se hai un'immagine nella dir gfx/pamela.jpg basta che dici al classloader di darti la risorsa 'gfx/pamela.jpg' e provvede lui a fare tutto. Stai attento alle varie modalità possibili per accedere ai package perchè puoi accedervi sia in maniera relativa che assoluta. Una pagina web che spiega piuttosto bene tutto il meccanismo è questa: http://www.javaworld.com/javaworld/j...ty.html?page=2 Nonostante sia stata scrtta per il caricamento delle properties spiega bene le differenze tra i 3 metodi: Codice:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties"); Class.getResourceAsStream ("/some/pkg/resource.properties"); ResourceBundle.getBundle ("some.pkg.resource"); ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ok, funziona perfettamente
![]() adesso ho un altro problema: non funziona più se eseguo le classi non compresse, per esempio lanciando java o javaw da un bat oppure lanciando il programma da Eclipse. è possibile scrivere del codice indipendente dal formato del bundle (jarrato o semplice ramo di directories) che carichi o decomprima (a seconda) le immagini dalla cartella gfx? ps: lol, pamela.jpg ![]() |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ecco, dimenticavo: non funziona perché la getResourceAsStream mi lancia una IllegalArgumentException che vorrei evitare di catturare perché non sarebbe codice indipendente dal formato del bundle
![]() |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
![]() ma vedi che quel codice funziona indipendentemente dal fatto che i tuoi files siano sentro un jar o no. L?importante è che la struttura della directory sia visibile al tuo class loader. Se ad esempio fai partire il tuo codice dalla directory classes e hai le risorse in una cartella resources è sufficiente che aggiungi al tuo classpath anche la cartella resources e tutto va a meraviglia ![]() P.S. e mi raccomando di non dimenticarti il disclaimer per impedire l'uso del tuo programma ai minori di anni 18 quando riesci finalmente a caricare il file pamela.jpg ![]() ![]() ARI-EDIT: tanto per essere + chiaro in una situazione reale probabilmente hai questa situazione: Codice:
base-dir | | | | classes resources Altrimenti, se inserisci la cartella resources nel classpath al posto di base-dir, nel tuo jar devi omettere quella cartella e comprimere semplicemente la cartella gfx con tutto il suo contenuto ( ![]() ![]() spero di essere stato un pò + chiaro ora ![]()
__________________
![]() Ultima modifica di ^TiGeRShArK^ : 23-10-2007 alle 12:59. |
|
![]() |
![]() |
![]() |
#8 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() ![]() |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
dai un'occhio al mio edit successivo altrimenti tra 5 minuti torni a bestemmiare qui sul forum
![]()
__________________
![]() |
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ![]() comunque non capisco, dovrebbe essere tutto regolare ma non carica ste immagini... fammici sbattere ancora un po' e poi torno a bestemmiare ![]() |
|
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
torno a bestemmiare
![]() allora, io ho la cartella del mio progetto contenente le seguenti tre cartelle:
sapendo che voglio caricare le immagini in questo modo: Codice:
UnaMiaClasse.class.getResourceAsStream("/gfx/" + nomeFileImmagineConAncheEstensione); ![]() |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
![]() solo che mi sa che in eclipse non te lo fa fare così ad occhio ![]() quindi creati una cartella resources in cui copi la tua cartella gfx e aggiungi resources al classpath ![]() ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ma veramente io vado dove mi permette di impostare i "VM arguments"... là posso scrivere qualunque cosa. ho provato a metterci:
Codice:
-cp . Codice:
-cp ./ ![]() |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
![]() Codice:
public class ProvaLoad { public ProvaLoad() { InputStream inputStream = ProvaLoad.class.getResourceAsStream("/gfx/xxx/pam.jpg"); if(inputStream != null) { System.out.println("non è null"); InputStreamReader isreader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(isreader); try { System.out.println(reader.readLine()); } catch (IOException e) { e.printStackTrace(); } } } ![]() quindi fai 'sta copia e non ti stressare ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a dire il vero a me non funziona mica eh... :|
basta, ci rinuncio: quando faccio il debug me lo tengo senza icone, e le icone le vedrò solo nel jar finale. tanto ormai sto programma l'ho quasi finito ![]() |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
|
Quote:
![]() io l'ho fatto in 3 secondi e ho semplicemente aggiunto al classpath la cartella gfx e quindi accedevo ai file usando il percorso /xxx/pam.jpg Nel caso in cui devi mantenere la cartella gfx nel percorso basta che crei una cartella resources, copi la tua cartella gfx li sotto e aggiungi la cartella resources nel classpath. E poi controlli che il tuo codice sia quanto meno simile a quello che ho postato ![]()
__________________
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:42.