Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
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


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...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Amazfit GTR 3 a 69€, il Pro a 99€,T-Rex ...
Stazione tutto in uno e i pavimenti li a...
Torna il re dei mini PC con AMD Ryzen 5 ...
RTX 5000 Laptop: ASUS svela tutti i dett...
Coupon e promo Amazon su 3 super portati...
La Cina pronta a sfidare NVIDIA? Le GPU ...
Samsung, mega accordo da 16,5 miliardi p...
Le 18 offerte Amazon del weekend, senza ...
Galaxy S25 Ultra 512GB sotto i 1.000€ su...
Vi piace l'iPhone nero? Su Amazon sono s...
MacBook Air M4 16GB/256GB e 16GB/512GB s...
4 portatili per risparmiare tanto ed ess...
San Marino multa TikTok: non controllano...
Dreame e Roborock in saldo su Amazon: ro...
Pazzesco su Amazon: crollano i prezzi de...
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: 07:42.


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