Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Immagine e Jar

  1. #1

    Immagine e Jar

    Salve a tutti,
    per creare il Jar di un mio progetto in java utilizzo un plugin, FatJar, che funziona bene se non fosse che non riesco ad includere un immagine nel jar.
    Questa immagine è presente nell'SRC del progetto e la utilizzo per un icona ma non ne vuole sapere di includermela nel Jar e quando sposto il file jar in un altro percorso non mi apre più l'immagine.

    Come posso risolvere?

    Vi ringrazio in anticipo,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    puoi creare il jar manualmente da linea di comando digitando:

    jar cfm nomeJar.jar nomeManifest.txt nomeImmagine.suoFormato *.class


  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: Immagine e Jar

    Originariamente inviato da Neptune
    Salve a tutti,
    per creare il Jar di un mio progetto in java utilizzo un plugin, FatJar, che funziona bene se non fosse che non riesco ad includere un immagine nel jar.
    Questa immagine è presente nell'SRC del progetto e la utilizzo per un icona ma non ne vuole sapere di includermela nel Jar e quando sposto il file jar in un altro percorso non mi apre più l'immagine.

    Come posso risolvere?

    Vi ringrazio in anticipo,
    Neptune.
    ho diverse domande:
    1. l'immagine è inclusa nel jar? il jar in fondo è un archivio, quindi con 7zip, winzip, winrar dovresti vederne il contenuto. Controlla che l'immagine sia realmente contenuta nel tuo jar
    2. come apri l'immagine?
    3. nel jar esporti i .class (in genere), quindi è tra i .class che probabilmente si aspetta di trovarla
    4. cambiare il classpath è una buona prova per vedere se hai messo tutto a posto
    RTFM Read That F*** Manual!!!

  4. #4
    Sono incappato anch'io qualche volta in questo problema.

    Per includere le immagini nel jar dovrai usarle come risorse o come stream nel tuo programma.
    Ti faccio un esempio per farti capire:
    codice:
    ImageIcon i=new ImageIcon("img.jpg"); //non carichi l'immagine come fosse una risorsa
    codice:
    ImageIcon i=new ImageIcon(getClass().getResource("img.jpg")); //carichi l'immagine come risorsa
    Solitamente si usa il primo modo per usare le immagini, ma a volte ci son dei problemi.
    Se invece prevedi di usarle come stream, allora usa il getResourceAsStream("img.jpg");
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  5. #5
    Ho provato a fare come hai detto, ovvero così:

    codice:
    File f = new File("");
    ImageIcon i=new ImageIcon(getClass().getResource(f.getAbsolutePath() + "/src/Test/test/nav.gif"));
    Ma mi solleva questa eccezione

    codice:
    Exception in thread "main" java.lang.NullPointerException
    	at javax.swing.ImageIcon.<init>(ImageIcon.java:181)
    	at Test.MainTesiTragitti.<init>(MainTesiTragitti.java:48)
    	at Test.MainTesiTragitti.main(MainTesiTragitti.java:54)
    E gli ho dato esattamente lo stesso percorso dove prima me lo trovava, quindi non riesco a capire perché da questo nullpointerexception
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Neptune
    Ho provato a fare come hai detto, ovvero così:

    codice:
    File f = new File("");
    ImageIcon i=new ImageIcon(getClass().getResource(f.getAbsolutePath() + "/src/Test/test/nav.gif"));
    Ma mi solleva questa eccezione

    codice:
    Exception in thread "main" java.lang.NullPointerException
    	at javax.swing.ImageIcon.<init>(ImageIcon.java:181)
    	at Test.MainTesiTragitti.<init>(MainTesiTragitti.java:48)
    	at Test.MainTesiTragitti.main(MainTesiTragitti.java:54)
    E gli ho dato esattamente lo stesso percorso dove prima me lo trovava, quindi non riesco a capire perché da questo nullpointerexception
    fatta cosi non hai bisogno di f.getAbsolutePath da aggiungere prima del tuo path.

    Prova a caricare solo la risorsa usando il classLoader (ClassLoader.getResource oppure getResourceAsStream) se usi getResource dai l'URL direttamente a ImageIcon.
    Solo per capire se trovi l'immagine o se hai problemi poi a caricarla (sono 2 cose separate)
    RTFM Read That F*** Manual!!!

  7. #7
    Originariamente inviato da valia
    fatta cosi non hai bisogno di f.getAbsolutePath da aggiungere prima del tuo path.

    Prova a caricare solo la risorsa usando il classLoader (ClassLoader.getResource oppure getResourceAsStream) se usi getResource dai l'URL direttamente a ImageIcon.
    Solo per capire se trovi l'immagine o se hai problemi poi a caricarla (sono 2 cose separate)
    Se faccio qualcosa del genere:

    codice:
    URL s = getClass().getResource("/Rotte_Navali/src/Test/test/nav.gif");
    System.out.println(s);
    Mi stampa sempre null, quindi non mi trova la risorsa!
    Sono su MacOS ho provato a dargli l'indirizzo in mille modi e non me lo riconosce, eppure con il vecchio metodo me la riusciva a trovare l'immagine da eclipse (anche se poi ovviamente non me la linkava nel jar).
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Neptune
    Se faccio qualcosa del genere:

    codice:
    URL s = getClass().getResource("/Rotte_Navali/src/Test/test/nav.gif");
    System.out.println(s);
    Mi stampa sempre null, quindi non mi trova la risorsa!
    Sono su MacOS ho provato a dargli l'indirizzo in mille modi e non me lo riconosce, eppure con il vecchio metodo me la riusciva a trovare l'immagine da eclipse (anche se poi ovviamente non me la linkava nel jar).
    ok ...e

    codice:
    URL s = getClass().getResource("Rotte_Navali/src/Test/test/nav.gif");
    cosa stampa?
    RTFM Read That F*** Manual!!!

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Giusto per aggiungere un po' di info, spiego come funzionano getResource() e getResourceAsStream() (lo fece già andbin molto tempo fa, ma vedo che comunque si continua a sbagliarne l'uso).

    getResource()/getResourceAsStream() funzionano allo stesso identico modo: il primo fornisce un oggetto URL che identifica una risorsa, il secondo fornisce un InputStream per poter leggere la risorsa come stream di byte.

    Entrambi usano la stessa tecnica che usa il ClassLoader per scovare le classi: ovvero, usano il CLASSPATH.

    La stringa da passare come parametro a getResource()/getResourceAsStream() è un percorso particolare:

    1) Se tale percorso è preceduto dal carattere "/", la JVM lo interpreterà come un percorso assoluto rispetto al CLASSPATH.

    2) Se tale percorso non è preceduto dal carattere "/", la JVM lo interpreterà come un percorso relativo al package della classe su cui lo si sta invocando.

    Facciamo un esempio.
    Il mio progetto è così composto:

    codice:
    uno
     |
     + ClasseUno.class
     + Immagine1.png
     |
     +--- due
     |     |
     +---  + ClasseDue.class
     +---  + Immagine2.png
     |     |
     +---  +--- tre
     |     |
     +---  +---  + ClasseTre.class
     +---  +---  + Immagine3.png
    Chiaramente, le tre classi avranno le seguenti intestazioni:

    codice:
    package uno;
    public class ClasseUno ... {
    
    package uno.due;
    public class ClasseDue ... { 
    
    package uno.due.tre;
    public class ClasseTre ... {
    Se io volessi usare l'immagine "Immagine3.png", da qualunque classe del mio progetto posso usare la seguente sintassi:

    codice:
    ImageIcon img = new ImageIcon( getClass().getResource("/uno/due/tre/Immagine3.png") );
    Se, invece, volessi usare un percorso "relativo", allora le cose cambiano:

    codice:
    // Per usarla da ClasseUno
    ImageIcon img = new ImageIcon( getClass().getResource("due/tre/Immagine3.png") );
    
    // Per usarla da ClasseDue
    ImageIcon img = new ImageIcon( getClass().getResource("tre/Immagine3.png") );
    
    // Per usarla da ClasseTre
    ImageIcon img = new ImageIcon( getClass().getResource("Immagine3.png") );
    Se avessi deciso di incapsulare tutte le immagini all'interno di una sottodirectory "resources" (cosa molto comune), il discorso non si sposta di una virgola: la directory "resources" sarebbe esattamente come una parte del package e segue esattamente le stesse regole.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Originariamente inviato da LeleFT
    Giusto per aggiungere un po' di info, spiego come funzionano getResource() e getResourceAsStream() (lo fece già andbin molto tempo fa, ma vedo che comunque si continua a sbagliarne l'uso).

    getResource()/getResourceAsStream() funzionano allo stesso identico modo: il primo fornisce un oggetto URL che identifica una risorsa, il secondo fornisce un InputStream per poter leggere la risorsa come stream di byte.

    Entrambi usano la stessa tecnica che usa il ClassLoader per scovare le classi: ovvero, usano il CLASSPATH.

    La stringa da passare come parametro a getResource()/getResourceAsStream() è un percorso particolare:

    1) Se tale percorso è preceduto dal carattere "/", la JVM lo interpreterà come un percorso assoluto rispetto al CLASSPATH.

    2) Se tale percorso non è preceduto dal carattere "/", la JVM lo interpreterà come un percorso relativo al package della classe su cui lo si sta invocando.

    Facciamo un esempio.
    Il mio progetto è così composto:

    codice:
    uno
     |
     + ClasseUno.class
     + Immagine1.png
     |
     +--- due
     |     |
     +---  + ClasseDue.class
     +---  + Immagine2.png
     |     |
     +---  +--- tre
     |     |
     +---  +---  + ClasseTre.class
     +---  +---  + Immagine3.png
    Chiaramente, le tre classi avranno le seguenti intestazioni:

    codice:
    package uno;
    public class ClasseUno ... {
    
    package uno.due;
    public class ClasseDue ... { 
    
    package uno.due.tre;
    public class ClasseTre ... {
    Se io volessi usare l'immagine "Immagine3.png", da qualunque classe del mio progetto posso usare la seguente sintassi:

    codice:
    ImageIcon img = new ImageIcon( getClass().getResource("/uno/due/tre/Immagine3.png") );
    Se, invece, volessi usare un percorso "relativo", allora le cose cambiano:

    codice:
    // Per usarla da ClasseUno
    ImageIcon img = new ImageIcon( getClass().getResource("due/tre/Immagine3.png") );
    
    // Per usarla da ClasseDue
    ImageIcon img = new ImageIcon( getClass().getResource("tre/Immagine3.png") );
    
    // Per usarla da ClasseTre
    ImageIcon img = new ImageIcon( getClass().getResource("Immagine3.png") );
    Se avessi deciso di incapsulare tutte le immagini all'interno di una sottodirectory "resources" (cosa molto comune), il discorso non si sposta di una virgola: la directory "resources" sarebbe esattamente come una parte del package e segue esattamente le stesse regole.


    Ciao.
    Ok ho risolto scrivendo:

    codice:
    ImageIcon i=new ImageIcon(getClass().getResource("/Test/test/nav.gif"));
    Quindi in pratica non vedeva come root la cartella della workspace, ovvero "Rotte_Navali", ma la cartella "src" in cui stavano dentro tutte le classi (e l'immagine gif).

    Vi ringrazio a tutti per l'aiuto.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.