Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale
Forte di soluzioni tecniche specifiche, il notebook Acer TravelMate P4 14 abbina dimensioni compatte e buona robustezza per rispondere alle necessità specifiche degli utenti aziendali. La piattaforma AMD Ryzen 7 Pro assicura prestazioni elevate con i tipici ambiti di produttività personale e sul lavoro, mantenendo un'elevata autonomia.
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-10-2007, 11:33   #1
71104
Bannato
 
L'Avatar di 71104
 
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...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 11:56   #2
Guille
Member
 
L'Avatar di Guille
 
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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...
Guardati i metodi getResource() e/o getResourceAsStream() di Class.
__________________
"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
Guille è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:10   #3
71104
Bannato
 
L'Avatar di 71104
 
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? si, della risorsa, ok , ma sto URL a cosa punta? a una cartella temporanea nel filesystem locale dove la JVM ha estratto i files? o che altro?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:42   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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? si, della risorsa, ok , ma sto URL a cosa punta? a una cartella temporanea nel filesystem locale dove la JVM ha estratto i files? o che altro?
Ogni risorsa messa all'interno di un file .jar può essere caricata utilizzando il classloader.
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");
Ovviamente però l'ultimo metodo funziona solo con file .properties mentre gli altri sono assolutamente generali
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:49   #5
71104
Bannato
 
L'Avatar di 71104
 
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
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:50   #6
71104
Bannato
 
L'Avatar di 71104
 
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
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:53   #7
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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

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
In quel caso se inserisci la directory basedir nel tuo classpath puoi accedere ai tuoi file usando il percorso "resources/gfx/pamela.jpg" che presumo manterrai anche nel tuo jar.
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 ( ) altrimenti quando andrai ad accedervi con il path "gfx/pamela.jpg" nel .jar ti ritrovi la directory resources nel mezzo e quindi ti sballa tutto
spero di essere stato un pò + chiaro ora
__________________

Ultima modifica di ^TiGeRShArK^ : 23-10-2007 alle 12:59.
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 12:56   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi

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 al di sopra di quella di partenza del 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
aaaaaaaah è vero, il cavolo di classpath! ora provo...

Quote:
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

e ti pareva che andavamo avanti co sta cazzata
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:02   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
aaaaaaaah è vero, il cavolo di classpath! ora provo...
dai un'occhio al mio edit successivo altrimenti tra 5 minuti torni a bestemmiare qui sul forum
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:05   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
dai un'occhio al mio edit successivo altrimenti tra 5 minuti torni a bestemmiare qui sul forum
infatti stavo giusto scrivendo quando mi son visto spuntare il Gmail Notifier che mi avvisava della nuova risposta nella discussione sottoscritta (visto che organizzazione? )

comunque non capisco, dovrebbe essere tutto regolare ma non carica ste immagini... fammici sbattere ancora un po' e poi torno a bestemmiare
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:18   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
torno a bestemmiare

allora, io ho la cartella del mio progetto contenente le seguenti tre cartelle:
  • bin, contenente i .class
  • gfx, contenente le immagini
  • src, contenente i sorgenti .java

sapendo che voglio caricare le immagini in questo modo:
Codice:
UnaMiaClasse.class.getResourceAsStream("/gfx/" + nomeFileImmagineConAncheEstensione);
quale classpath devo impostare in Eclipse?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:44   #12
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
torno a bestemmiare

allora, io ho la cartella del mio progetto contenente le seguenti tre cartelle:
  • bin, contenente i .class
  • gfx, contenente le immagini
  • src, contenente i sorgenti .java

sapendo che voglio caricare le immagini in questo modo:
Codice:
UnaMiaClasse.class.getResourceAsStream("/gfx/" + nomeFileImmagineConAncheEstensione);
quale classpath devo impostare in Eclipse?
".", ovvero la directory base del tuo progetto, come avevo scritto nell'edit
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

__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 13:47   #13
71104
Bannato
 
L'Avatar di 71104
 
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 ./
ma sinceramente mi sembrano un tantinello inutili... anche perché non va con nessuno dei due
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:08   #14
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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 ./
ma sinceramente mi sembrano un tantinello inutili... anche perché non va con nessuno dei due
ho provato e se lo copi sotto resources o una qualche altra cartella e aggiungi quella al classpath funge perfettamente
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();
			}
		}
	}
se passi l'opzione -cp . direttamente da eclipse sinceramente non so che effetto può avere dato che gli stai passando la directory base del suo progetto... e non ho idea se eclipse fa qualche controllo particolare, ma presumo di si dato che se provi ad aggiungere la directory stessa del progetto nel classpath ti bestemmia in aramaico e non te lo fa fare
quindi fai 'sta copia e non ti stressare
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:16   #15
71104
Bannato
 
L'Avatar di 71104
 
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
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2007, 14:20   #16
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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
ma come no cazz?
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
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
Apple aggiorna tutto: iOS 18.6, macOS Se...
YouTube saprà quanti anni hai, an...
Meta AI su WhatsApp: l'Antitrust apre un...
Tantissima sostanza, batteria da 7000mAh...
Legge sui social in Australia: YouTube i...
100€ di sconto reale, solo 399€ per la P...
Oggi i Macbook Air da 13 pollici con chi...
Meta ruba il futuro dell'AI ad Apple: fu...
Torna a 104€ il robot bestseller Lefant ...
Groq, la startup che vuole sfidare NVIDI...
AMD Ryzen AI Max+: ora anche gli LLM da ...
ChatGPT diventa tutor, addio risposte fa...
Cooler Master MasterFrame 600: modularit...
Questi case sembrano GPU RTX 50 e costan...
Elgato Facecam 4K: ecco la nuova webcam ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v