2012-10-23 65 views
22

Sto cercando di caricare un barattolo utilizzandoImpossibile trovare o caricare la classe principale con un file JAR

@echo off 
java -jar Test.jar 
pause 

Con il manifesto di

Manifest-Version: 1.0 
Main-Class: classes.TestClass 

Nella directory Jar, posso vedere chiaramente un file classes \ TestClass quando lo estrai.

Modifica: classes.TestClass ha un public static void main(String[] args).

decelerazione pacchetto in classes.TestClass è package classes;

Ma io ancora continuo a ricevere il messaggio di errore

Could not find or load main class classes.TestClass 

che ho passato tutto quello che ho potuto trovare con questo problema, e nessuno di esso sembra aiutare.

Ho provato a modificare il classpath, ripristinare il manifest, installare il nuovo JRE.

Che altro dovrei fare?

+1

TestClass contiene una funzione principale? – Baz

+1

@Baz Sì, ha un metodo principale. – Austin

+2

Sei sicuro che il nome del pacchetto per 'TestClass' è' classes'? –

risposta

7

1.Creare un file di testo calles Manifest.txt e fornire il valore come

Main-Class: classes.TestClass

2.Creare il vaso come

jar cfm test.jar Manifest.txt classes/*. class

3.le il vaso come

java-jar test.jar

+0

Puoi dire come è il tuo percorso java e il set di percorsi di classe. Solo una cosa che puoi provare prima di rispondere. Prova a eseguire lo stesso TestClass tramite la riga di comando anziché Eclipse. – Arham

+0

Posso eseguire la classe bene usando la riga di comando. Insieme ad altri comandi java come javac. – Austin

1

Questo è molto difficile da eseguire il debug senza informazioni complete.

Le due cose più probabili a questo punto sono che il file nel jar non è memorizzato in una directory WITHIN THE JAR o che non è il file corretto.

È necessario memorizzare TestClass.class - alcune persone nuove in questo archivio il file di origine, TestClass.java.

Ed è necessario creare il file jar in modo che TestClass.class venga visualizzato con un percorso di classi. Assicurati che non sia "/ classes". Usa zip per guardare il file e assicurati che abbia un percorso di "classi".

13

ho ottenuto che funziona in questo modo:

TestClass.Java

package classes; 

public class TestClass { 

    public static void main(String[] args) { 
     System.out.println("Test"); 
    } 

} 

Usa javac sulla riga di comando per la produzione di TestClass.class. Metti TestClass.class in una cartella classes/.

MANIFEST.MF

Manifest-Version: 1.0 
Main-Class: classes.TestClass 

Quindi eseguire

jar cfM MANIFEST.MF test.jar classes/ 

quindi eseguirlo come

java -jar test.jar 
+3

Vorrei sottolineare un punto implicito nella risposta: è importante "cd" per il percorso che sarebbe stato utilizzato come percorso classe era TestClass.class eseguito senza un file jar. Ad esempio, "cd/MyEclipseWorkspace/MyProject/bin" Se, invece, jar utilizza il percorso assoluto dei file di classe, potrebbe non riuscire con l'errore "Impossibile trovare o caricare la classe principale". Ad esempio, questo è sbagliato: jar cfm test.jar manifest.txt /absolutepath/classes/TestClass.class – Corral

+1

@ Il commento di Corral non deve essere ignorato. Mi stavo strappando i capelli cercando di risolvere questo problema finché non lo leggevo, e ora il mio barattolo funziona perfettamente. –

+0

'>% JAVAHOME% \ bin \ jar cfM MANIFEST.MF test.jar classi /' risultati in 'test.jar: nessun file o directory 'e' MANIFEST.JS' sono ora danneggiati (il suo file binario ora). –

2

Ho appena avuto lo stesso problema, alla fine, è perché ho copiato e incollato il codice a parole ed era un tipo leggermente diverso di '-' char acter utilizzato, questo è tutto quello che posso pensare, quando ho digitato manualmente ha funzionato

11

java -cp "full-path-del-tuo-jar" Main

per eseguire qualsiasi altra classe avere "static void main pubblica" in qualche pacchetto,

java -cp "full-path-del-tuo-jar" package1.package2.packages-hierarchy.ClassHavingMain

+2

Per favore aggiungi una spiegazione quando fai un downvote di qualcosa. –

+1

Devi inserire il percorso completo se ti trovi nella stessa directory del tuo jar? – Ungeheuer

+0

questo ha davvero risolto il mio problema. Il mio manifest.md non funziona mai ... –

1

a lea st il modo in cui ho fatto questo è il seguente:

Se si dispone di un albero src annidato (dire com.test.myclass.MyClass) e si compila da una directory radice è necessario effettuare le seguenti operazioni:

1) quando si crea il vaso (di solito mettere questo in uno script): vaso -cvfm my.jar com/test/myclass/manifest.txt com/test/myclass/MyClass.class

2) la manifest dovrebbe essere:

Mainfest-versione: 1.0 Main-Class: com.test.myclass.MyClass Class-Pat h:. my.jar

3) Ora è possibile eseguire il vaso da qualsiasi luogo come questo:

java-jar my.jar

Spero che questo aiuti qualcuno

2

Ho avuto un problema simile che ho potuto risolvere con la concessione di esecuzione con privilegi per tutte le cartelle superiori in cui si trova il file jar (su un sistema Linux).

Esempio:

/folder1/folder2/folder3/executable.jar

tutti e 3 cartelle (cartella1, cartella2 e Folder3), così come il bisogno executable.jar esecuzione con privilegi per l'utente corrente, altrimenti viene restituito l'errore "Impossibile trovare o caricare la classe principale ...".

0

Ho avuto un problema strano quando una voce errata in MANIFEST.MF stava causando il caricamento non riuscito. Questo è stato quando stavo cercando di lanciare un programma molto semplice Scala:

errato:

Main-Class: jarek.ResourceCache 
Class-Path: D:/lang/scala/lib/scala-library.jar 

corretta:

Main-Class: jarek.ResourceCache 
Class-Path: file:///D:/lang/scala/lib/scala-library.jar 

Con una versione non corretta, mi è stato sempre un messaggio criptico, lo stesso l'OP ha fatto. Probabilmente dovrebbe dire qualcosa come l'eccezione dell'url malformata durante l'analisi del file manifest.

L'utilizzo di un percorso assoluto nel file manifest è ciò che IntelliJ utilizza per fornire un classpath lungo per un programma.

Problemi correlati