Errore con file .jar: Nessun attributo manifest principale

di il
30 risposte

Errore con file .jar: Nessun attributo manifest principale

Ciao ragazzi.
Ormai è una settimana che sto impazzendo perché non riesco a creare bene un jar eseguibile.
Quando eseguo dal cmd:
java -jar ilmiofile.jar
ricevo come errore: Unable to access jarfile ilmiofile.jar e provo a creare l’eseguibile (è la prima volta che ci provo per questo non so come risolvere il problema) con Launch4j mi da come errore “nessun attributo manifest principale”.
Ho già letto altre discussioni che parlano di questo problema, ma non fanno al caso mio.

30 Risposte

  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Ormai è una settimana che sto impazzendo perché non riesco a creare bene un jar eseguibile.
    Quando eseguo dal cmd:
    java -jar ilmiofile.jar
    ricevo come errore: Unable to access jarfile ilmiofile.jar
    Sicuramente nel manifest manca l'attributo Main-Class (che è quello che serve per avviare direttamente il jar con -jar )
    Quindi chiarisci come crei il jar (con il tool jar del JDK? Da un IDE? Con altro strumento?) e eventualmente precisa dove hai le classi (come struttura delle directory).
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Allora si in effetti non sono stato abbastanza chiaro. Questa notte mi sono informato di più è ho visto che nel cmd mi dava quell’errore perché dovevo mettere tutto l’indirizzo del file e tra virgolette e anche lì mi da l’errore per il main. Ho capito che il problema è Netbeans (si uso un IDE). Anche se esplicito la classe main (cosa che ho sempre fatto) dove andrebbe fatto, quando buildo non la scrive comunque nel Manifest.MF. Avevo visto su YouTube uno che aveva lo stesso problema e faceva come faccio sempre e Netbeans l’ha scritto, ma non so perché a me no. Allora ho provato a rendere il Manifest.MF in txt per poterlo scrivere a mano (ho scritto bene), e comunque non la legge.
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Netbeans non centra proprio una cippa!

    DEVI avere il file in "META-INF/MANIFES.MF" CASE SENSITIVE con il contenuto
    
    Main-Class: MyPackage.MyClass
    
    https://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html
    https://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

    Invece di guardare su youtube gente che non sa un'accidenti, STUDIA dalle FONTI UFFICIALI!!!
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Anche se esplicito la classe main (cosa che ho sempre fatto) dove andrebbe fatto, quando buildo non la scrive comunque nel Manifest.MF.
    Se si scrive "a mano" il file del manifest, bisogna farlo in modo molto accurato perché le specifiche del manifest sono ultra-pignole!

    Dalla documentazione ufficiale JAR File Specification:

    Groups of name-value pairs are known as a "section". Sections are separated from other sections by empty lines.

    No line may be longer than 72 bytes (not characters), in its UTF8-encoded form. If a value would make the initial line longer than this, it should be continued on extra lines (each starting with a single SPACE).

    E anche se adesso non ritrovo la info, se ben ricordo al fondo del manifest ci deve essere una riga "vuota". Se la riga con il Main-Class l'hai messa al fondo, in realtà NON può essere l'ultima. Ci deve essere dopo una riga vuota.
  • Re: Errore con file .jar: Nessun attributo manifest principale

    OK ragazzi grazie a voi ha funzionato. In effetti non avevo messo la linea finale nel MF.
    Ora però ci sono 2 problemi. Le immagini si trovano in un apposita cartella Icon nella cartella src, ma quando eseguo il jar non le carica. Il secondo problema è che vorrei che sia Netbeans che inserisca la classe main nel MF e non io ogni volta dato che è lui che dovrebbe farlo. Sapete come risolvere questi 2 problemi?
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Le immagini si trovano in un apposita cartella Icon nella cartella src, ma quando eseguo il jar non le carica.
    "solita" questione. Devi precisare COME (con quale classe/metodo) carichi le immagini: ImageIcon? La API ImageIO? Il Toolkit di AWT? Altro?
    E cosa hai usato come specifica della immagine.

    Se le immagini sono "parte fissa" della applicazione, il modo tipico/corretto è di trattarle secondo il concetto delle "risorse" come inteso dal class loader.

    Bryan ha scritto:


    Il secondo problema è che vorrei che sia Netbeans che inserisca la classe main nel MF
    Non uso normalmente NetBeans quindi su questo non saprei dire ora. Probabilmente attraverso una "opzione di progetto" o magari specificando una run-configuration ....
  • Re: Errore con file .jar: Nessun attributo manifest principale

    andbin ha scritto:


    "solita" questione. Devi precisare COME (con quale classe/metodo) carichi le immagini: ImageIcon? La API ImageIO? Il Toolkit di AWT? Altro?
    E cosa hai usato come specifica della immagine.

    Se le immagini sono "parte fissa" della applicazione, il modo tipico/corretto è di trattarle secondo il concetto delle "risorse" come inteso dal class loader.
    Le immagini le implemento usando
    .setIcon(new javax.swing.ImageIcon("src/Icon/Wallpaper.jpg"));

    andbin ha scritto:


    Non uso normalmente NetBeans quindi su questo non saprei dire ora. Probabilmente attraverso una "opzione di progetto" o magari specificando una run-configuration ....
    E io così ho fatto. C'è la sezione run nelle proprietà del progetto dove si seleziona la classe main. Solo che non so perché agli altri la scrive nel jar, ma a me no.
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Le immagini le implemento usando
    .setIcon(new javax.swing.ImageIcon("src/Icon/Wallpaper.jpg"));
    Una specifica come quella è inappropriata per almeno 2 motivi:
    a) è sul file-system ed è "relativa" alla directory corrente. NON può pescare le immagini dentro un jar.
    b) C'è "src" dentro. Quando la tua applicazione vivrà per "conto suo" (fuori da un IDE, ecc...) la src NON conta e non c'entra più un bel niente.


    Fai un metodo di factory delle icone da qualche parte, es.:
    public class AppResources {
        public static Icon loadIcon(String name) {
            return new ImageIcon(AppResources.class.getResource("/Icon/" + name));
        }
    }

    xyz.setIcon(AppResources.loadIcon("Wallpaper.jpg"));
  • Re: Errore con file .jar: Nessun attributo manifest principale

    andbin ha scritto:


    Bryan ha scritto:


    Le immagini le implemento usando
    .setIcon(new javax.swing.ImageIcon("src/Icon/Wallpaper.jpg"));
    Una specifica come quella è inappropriata per almeno 2 motivi:
    a) è sul file-system ed è "relativa" alla directory corrente. NON può pescare le immagini dentro un jar.
    b) C'è "src" dentro. Quando la tua applicazione vivrà per "conto suo" (fuori da un IDE, ecc...) la src NON conta e non c'entra più un bel niente.


    Fai un metodo di factory delle icone da qualche parte, es.:
    public class AppResources {
        public static Icon loadIcon(String name) {
            return new ImageIcon(AppResources.class.getResource("/Icon/" + name));
        }
    }

    xyz.setIcon(AppResources.loadIcon("Wallpaper.jpg"));
    E le prende ovunque siano nel pc giusto?
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    E le prende ovunque siano nel pc giusto?
    "ovunque" no. La directory Icon deve andare dentro il jar.
  • Re: Errore con file .jar: Nessun attributo manifest principale

    andbin ha scritto:


    "ovunque" no. La directory Icon deve andare dentro il jar.
    No aspetta non ho capito bene.
    Quando buildo il codice il programma le mette nel jar e quindi quando lo metto in un altro computer le ha già?
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Quando buildo il codice il programma le mette nel jar e quindi quando lo metto in un altro computer le ha già?
    Non so che tipologia di progetto hai creato ma se non è basato su Maven/Gradle (dove sorgenti java e risorse stanno in cartelle separate sotto src), allora di norma sotto "src" vuol dire che c'è già direttamente tutto, cioè sorgenti .java e le risorse. Ed è già così, implicito, che il build vada a "ribaltare" le risorse nella cartella dei binari dove ci sono .class compilati. E tutto questo andrà anche nel jar.

    E quindi sì, le immagini saranno nel jar. Si fa apposta per questo.
  • Re: Errore con file .jar: Nessun attributo manifest principale

    andbin ha scritto:


    Fai un metodo di factory delle icone da qualche parte, es.:
    public class AppResources {
        public static Icon loadIcon(String name) {
            return new ImageIcon(AppResources.class.getResource("/Icon/" + name));
        }
    }

    xyz.setIcon(AppResources.loadIcon("Wallpaper.jpg"));
    Ciao! Ho provato a fare come mi hai detto tu, ma il programma non trova l'immagine, dandomi l'eccezione NullPointer.
    Premetto che ho dovuto modificare il codice rendendolo:
    public static Icon loadIcon(String name) {
    	return new ImageIcon(Portale.class.getResource("/Icon/" + name)); 
    }
    xyz.setIcon(loadIcon("Wallpaper.jpg"));
    Per quello che ne so io di programmazione ad oggetti non cambia nulla (anzi), ma per l'eccezione non so che fare. Forse la va a cercare in target/classes?
  • Re: Errore con file .jar: Nessun attributo manifest principale

    Bryan ha scritto:


    Ho provato a fare come mi hai detto tu, ma il programma non trova l'immagine, dandomi l'eccezione NullPointer.
    Verifica a mano il contenuto del jar. C'è "alla radice" del jar una cartella chiamata esattamente Icon e con dentro un file Wallpaper.jpg ?
    Se no ... il build o la creazione del jar ha sbagliato qualcosa.

    Bryan ha scritto:


    Premetto che ho dovuto modificare il codice rendendolo:
    public static Icon loadIcon(String name) {
    	return new ImageIcon(Portale.class.getResource("/Icon/" + name)); 
    }
    La classe da usare per il getResource in questo caso è abbastanza ininfluente, perché la specifica inizia per "/" ovvero Icon lo cerca "alla radice" lungo il classpath. Non conta il package della classe usata per il class literal su cui si invoca getResource.
Devi accedere o registrarti per scrivere nel forum
30 risposte