Perché non è riuscito a caricare l'attributo manifest della classe principale da un file JAR?


85

Ho creato un file JAR in questo modo jar cf jar-file input-files. Ora sto cercando di eseguirlo. L'esecuzione non funziona (il comando jre non è stato trovato):

jre -cp app.jar MainClass

Anche questo non funziona:

java -jar main.jar

(Impossibile caricare l'attributo manifest della classe principale da main.jar).

L'ho scoperto anche io

Per eseguire un'applicazione confezionata come file JAR (versione 1.2 - richiede l'intestazione del manifesto di classe principale)

Che cos'è l '"intestazione manifest della classe principale"? Come lo creo e dove lo metto?

Risposte:


62

Non sono sicuro di credere ai tuoi sintomi:

  • Se il jrecomando non viene trovato, l'esecuzione jre -cp app.jardovrebbe restituire lo stesso errore
  • La semplice aggiunta di un file JAR al classpath non dovrebbe dare l'errore che stai vedendo

Mi aspetto che visualizzi questo errore se esegui:

java -jar app.jar

L'intestazione Main-Class deve essere nel manifest per il file JAR: si tratta di metadati su cose come altre librerie richieste. Vedere la documentazione di Sun per come creare un manifest appropriato. Fondamentalmente è necessario creare un file di testo che includa una riga come questa:

Main-Class: MainClass

Allora corri

jar cfm app.jar manifest.txt *.class

Grazie. Funziona. Ho creato un file manifest con Main-Class: MainClasse poi ho creato il file .jar con il comando che hai dato. Dopo di che sono stato in grado di eseguire il mio programma java -jar main.jar.
Roman

1
Un'altra opzione è usare l'opzione -e, senza bisogno di un file separato. jar cfe app.jar MainClass *.classNota: -e è stato aggiunto in JDK 6.
pferate

35
  1. imposta il classpath e compila

    javac -classpath "C: \ Program Files \ Java \ jdk1.6.0_ updateVersion \ tools.jar" tuaApp.java

  2. creare manifest.txt

    Main-Class: la tua nuova riga di app

  3. crea la tuaApp.jar

    jar cvf0m tuaApp.jar manifest.txt tuaApp.class

  4. esegui yourApp.jar

    java -jar yourApp.jar


9

Puoi correre con:

java -cp .;app.jar package.MainClass

Per me funziona se non è presente alcun manifest nel file JAR.


Ho: opzione non riconosciuta: -cp. Potresti rivedere la tua risposta? Perché non so cosa sta cercando di fare questo comando. (java -cp.; app.jar package.MainClass). Questo è un comando o due?
kenorb

1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… "-cp.; app.jar" dovrebbe aggiungere il tuo file app.jar al percorso classe, quindi puoi eseguire il metodo MainClass.main () ( MainClass è nel pacchetto "package").
Dainius

1
Quindi probabilmente su Linux questa opzione (-cp) non esiste (il mio è java v1.6.0_24, OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1)).
Kenorb

java -version => VM server Java HotSpot (TM) a 64 bit (build 20.1-b02, modalità mista) "java -cp. test1.Main" funziona
Dainius

/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => VM server OpenJDK a 64 bit (build 20.0-b12, modalità mista) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "funziona
Dainius

6

Ho ricevuto questo errore, ed era perché avevo gli argomenti nell'ordine sbagliato:

CORRETTA

java maui.main.Examples tagging -jar maui-1.0.jar 

SBAGLIATO

java -jar maui-1.0.jar maui.main.Examples tagging 

1
Questo potrebbe essere solo un problema di BSD, sono abbastanza sicuro di averlo fatto nell'altro modo di recente.
Sridhar Sarnobat

1

Il modo più semplice per essere sicuri di aver creato correttamente il file JAR eseguibile, con il file manifest appropriato, è utilizzare Eclipse per crearlo. Nel tuo progetto Eclipse, in pratica devi solo selezionare File / Esporta dal menu e seguire le istruzioni.

In questo modo, puoi essere certo che il tuo file JAR sia corretto e saprai di cercare altrove se il problema persiste. Il processo è descritto in modo completo nelle FAQ. Come si crea un file JAR eseguibile per un programma SWT autonomo? .


Grazie per ExportEclipse IDE.
Ninh Pham

1

Provare

java -cp .:mail-1.4.1.jar JavaxMailHTML 

non c'è bisogno di avere manifestfile.


0

Ho scoperto che stavo anche avendo questo errore in NetBeans. Spero che quanto segue sia utile.

  1. Assicurati che quando vai su Configurazione progetto imposti la classe principale che intendi eseguire.
  2. Fai una build o una build pulita
  3. Posiziona il file jar dove desideri e prova: java -jar "YourProject.jar" di nuovo sulla riga di comando.

Questo era il problema che stavo riscontrando perché avevo altri programmi di "prova" che stavo usando in NetBeans e dovevo assicurarmi che la classe principale nella parte Esegui della configurazione del progetto fosse impostata correttamente.

molte benedizioni, John P


0

Ricevo lo stesso errore quando ho eseguito:
jar cvfm test.jar Test.class Manifest.txt

Ciò che ha risolto è stato questo:
jar cvfm test.jar Manifest.txt Test.class

Il mio manifest ha il punto di ingresso come indicato nei documenti Oracle (assicurati che ci sia un nuovo carattere di riga alla fine del file):
Main-Class: Test


0

Ho affrontato lo stesso problema. Questo comando unix non è in grado di trovare la classe principale. Questo perché le versioni di JDK di runtime e di compilazione sono diverse. Crea il jar tramite eclipse dopo aver modificato la versione del compilatore java. Il seguente collegamento mi ha aiutato.

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

Prova a eseguire il jar creato dopo questo passaggio e quindi eseguilo


0

Se il percorso della classe è completamente specificato nel manifesto, forse è necessaria l' ultima versione dell'ambiente di runtime java. Il mio problema è stato risolto quando ho reinstallato jre 8.


0

Se utilizzi eclipse, prova di seguito: 1. Fai clic con il pulsante destro del mouse sul progetto -> seleziona Esporta 2. Seleziona il file Jar eseguibile nel selezionare una destinazione di esportazione 3. Inserisci il nome del jar e seleziona "Pacchetto richiesto ..." (secondo pulsante di opzione) -> Fine

Spero che sia di aiuto...!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.