Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    File .jar non viene eseguito: "impossibile trovare o caricare la classe principale jar"

    Salve,
    non riesco ad eseguire un semplice programma Java che ho "impacchettato" manualmente in un file .jar, commettendo forse qualche errore.
    Il programma è costituito da due file .java, posizionati in due sottocartelle di una cartella "Codici", e dal MANIFEST.MF creato anch'esso manualmente e salvato nella sottocartella META-INF di "Codici".
    Il file MANIFEST è il seguente:
    codice:
    Manifest-Version: 1.0
    Created-By: 1.8.0.131 (Oracle Corporation)
    Main-Class: principale.CamiciaTest
    con riga vuota finale. La versione di Java l'ho ricavata dalla cartella dov'è installato il JDK; principale è il package dove si trova la classe Camicia Test col metodo main().
    Il file .jar è stato creato posizionando il prompt nella cartella "Codici" con
    codice:
    jar cf CamiciaTest.jar principale secondario META-INF
    Nel file .jar i file ci sono tutti (anche i .java sebbene servano i .class), ma eseguendo
    codice:
    java jar CamiciaTest.jar
    visualizzo l'errore impossibile trovare o caricare la classe principale jar
    Il programma non compresso funziona tranquillamente chiamando il package tra "java" e "CamiciaTest".
    Penso ci sia qualcosa di errato nel MANIFEST, ma non capisco cosa.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    con riga vuota finale.
    Sì, è importante perché la struttura del manifest è ultra-pignola.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    La versione di Java l'ho ricavata dalla cartella dov'è installato il JDK
    Il Created-By non è rilevante/utile ... è solo informativo.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    codice:
    jar cf CamiciaTest.jar principale secondario META-INF
    Non hai indicato il manifest!! (non basta tirar dentro una META-INF !!)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non hai indicato il manifest!! (non basta tirar dentro una META-INF !!)
    Nel file .jar il MANIFEST c'è...
    Avevo capito che si potessero indicare le cartelle e jar.exe caricava tutto il contenuto. Vediamo andando sullo specifico.

    Altra domanda: ho letto che, una volta generati tutti i file .class con gli eventuali package, posso organizzarli in una cartella e creare il file .jar... Immagino però che i file .class debbano conservare la posizione relativa (non ho progetti complessi) e non essere copiati in un'unica cartella di comodo "tanto ci sono le indicazioni dei package"...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Nel file .jar il MANIFEST c'è...
    Ma non è quello che hai messo tu a mano nella META-INF !

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Avevo capito che si potessero indicare le cartelle e jar.exe caricava tutto il contenuto.
    Sì ma la META-INF è "particolare".

    Quindi:

    a) se non devi mettere attributi particolari nel manifest (es. Class-Path o altro) ma solo il Main-Class:

    jar cfe CamiciaTest.jar principale.CamiciaTest principale secondario

    l'opzione -e specifica la main class in modo più semplice

    b) se devi per forza creare un manifest, allora crei un es. manifest.txt (il nome NON è rilevante ... anche pluto.txt funzionerebbe) con solo:

    Main-Class: principale.CamiciaTest
    --riga vuota--


    poi

    jar cfm CamiciaTest.jar manifest.txt principale secondario
    oppure
    jar cmf manifest.txt CamiciaTest.jar principale secondario

    Nota l'ordine di f/m e di jar/manifest. Devono corrispondere!

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Altra domanda: ho letto che, una volta generati tutti i file .class con gli eventuali package, posso organizzarli in una cartella e creare il file .jar... Immagino però che i file .class debbano conservare la posizione relativa (non ho progetti complessi) e non essere copiati in un'unica cartella di comodo "tanto ci sono le indicazioni dei package"...
    I nomi di package si DEVONO sempre "riflettere" nella struttura delle cartelle. Quindi una classe com.esempio.Demo DEVE stare in com/esempio/Demo.class

    Poi la "com" può stare dentro una directory xyz/ o dentro un xyz.jar, non ha importanza (fintanto che la xyz/ o xyz.jar siano "in classpath")

    Se vuoi far andare tutti i file .class generati in un'altra directory ben distinta da quella dei sorgenti (che è una cosa buona) es.

    codice:
    nomeprogetto/
        build/
            ....
        src/
            com/
                .....

    Sì, ok, basta usare l'opzione -d di javac. E attenzione: la directory di destinazione va messa in classpath, non è automatico con -d
    Ultima modifica di andbin; 13-07-2017 a 22:51
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Non funziona.
    Ho creato manifest.txt nella cartella "Codici" con dentro solo l'indicazione della Main-Class e la riga vuota.
    Crea il file .jar ma non lo esegue.
    Idem con cfe senza file manifest.

    Nel file MANIFEST che crea jar.exe ci sono comunque tutte le informazioni aggiuntive che mettevo ieri io.

  6. #6
    Uff, risolto: in esecuzione occorre java -jar, non java jar!
    Caxxo di fonti talebane...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.