Ce inseamna "nu a Putut găsi sau sarcina principală de clasa" înseamnă?

O problemă comună care noi dezvoltatorii Java experiență este că lor nu reușesc să ruleze programe cu un mesaj de eroare: nu a Putut găsi sau de sarcină principală clasa ...

Ce înseamnă acest lucru, ceea ce provoacă, și cum ar trebui să-l repara?

Comentarii la întrebare (1)
Soluția

Anii `java comandă sintaxă

Mai întâi de toate, aveți nevoie pentru a înțelege modul corect de a lansa un program folosind java "(sau " javaw`) de comandă. Normal sintaxa1 este aceasta:

    java [  ... ]  [ ...]

unde <opțiune> este o opțiune de linie de comandă (începând cu o "-" caracter), <clasa-numele> este o clasă Java complet calificat nume, și ` este un arbitrare argument linie de comandă care se transmite la cererea dumneavoastră. 1 - Există un al doilea sintaxa pentru "executabil" fișierele JAR care le voi descrie mai jos. Numele complet calificat (FQN) pentru clasa convențional este scris ca tine ar fi, în Java codul sursă; de exemplu,

    packagename.packagename2.packagename3.ClassName

Cu toate acestea unele versiuni de java comandă permite să utilizați slash-uri în loc de perioade; de exemplu,

    packagename/packagename2/packagename3/ClassName

care (confuzie) arata ca un fișier pathname, dar nu't unul. Rețineți că termenul complet calificat nume este Java standard de terminologie ... ceva ce nu am făcut până la a te confunda :-) Aici este un exemplu de ceea ce o java comanda ar trebui să arate astfel:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

De mai sus este de gând să provoca java comandă pentru a face următoarele:

  1. Căutare pentru versiunea compilată din com.acme.exemplu.ListUsers` clasa.
  2. Sarcina clasei.
  3. Verificați că clasa are un "principal" metoda cu semnătura, tipul de retur și modificatori date de public static void main(String[])`. (Notă, metoda argument's nume este NU de semnătură.)
  4. Suna ca metodă de trecere a argumentelor din linia de comandă ("fred", "joe", "bert"), ca un String[]`. Motivele pentru Java nu poate găsi clasa

    Când ai primit mesajul "nu a Putut găsi sau de sarcină principală clasa ...", asta înseamnă că primul pas a eșuat. Anii java, comanda nu a fost în stare să găsească clasa. Și într-adevăr, "..." în mesajul va fi complet calificat nume de clasăjava este în căutarea pentru. De ce ar fi în imposibilitatea de a găsi clasa? Motivul #1 - ai făcut o greșeală cu classname argument

    Primul probabil cauza este că pot fi furnizate greșit numele clasei. (Sau ... chiar numele clasei, dar în formularul greșit.) Având în vedere exemplul de mai sus, aici sunt o varietate de moduri greșite pentru a specifica numele clasei:

  • Exemplu #1 - un simplu nume de clasă:

java ListUser Atunci când clasa este declarat într-un pachet, cum ar fi com.acme.de exemplu, atunci trebuie să utilizați plin classname inclusiv pachetul nume în anii java comanda; de exemplu, java com.acme.exemplu.ListUser

  • Exemplu #2 - un nume de fișier sau o cale mai degrabă decât un nume de clasă: java ListUser.class java com/acme/example/ListUser.class
  • Exemplu #3 - un nume de clasă cu carcasa incorecte: java com.acme.exemplu.listuser
  • Exemplul #4 - o greșeală de scriere java com.acme.exemplu.mistuser
  • Exemplul #5 - o sursa fisierului java ListUser.java
  • Exemplu #6 - ai uitat numele clasei în întregime java o mulțime de argumente Motivul #2 - aplicarea's classpath este incorect specificat

    Cea de-a doua cauză probabilă este că numele clasei este corectă, dar că java comanda nu poate găsi clasa. Pentru a înțelege acest lucru, aveți nevoie pentru a înțelege conceptul de "classpath". Acest lucru este explicat bine prin documentația Oracle:

  • A java comanda documentația
  • Setare Classpath.
  • Java Tutorial - CALE și CLASSPATH Așa că ... dacă ați specificat numele clasei corect, următorul lucru pentru a verifica este că le-ați specificat classpath corect:
  1. Citește cele trei documente legate de mai sus. (Da ... le-ai CITIT. Este important ca un programator Java înțelege cel puțin elementele de bază ale cum Java-classpath mecanisme funcționează.)
  2. Uita-te la linia de comandă și / sau variabila de mediu CLASSPATH care este în vigoare, atunci când tu a alerga java comanda. Verificați că numele de directoare și fișiere JAR denumiri sunt corecte.
  3. Dacă nu există relative cai de acces în clase, verificați care le rezolva corect ... din directorul curent care este în vigoare, atunci când tu a alerga java comanda.
  4. Verificați că clasa (menționat în mesajul de eroare) pot fi situate pe eficient classpath.
  5. Rețineți că classpath sintaxa este diferite pentru Windows versus Linux și Mac OS. (Classpath separator este ; pe Windows și : pe alții. Dacă utilizați greșit separator pentru platforma ta, ai câștigat't obține o explicit mesaj de eroare. În schimb, veți obține un fișier inexistent sau director pe calea care va fi ignorată în tăcere.) Motivul #2a - directorul greșit este pe cale de clase

    Când ai pus-o director pe clase, nu la modul teoretic corespunde rădăcina calificat spațiu de nume. Clasele sunt situate în structura de directoare de sub root, de cartografiere numele complet calificat să o pathname. Deci, de exemplu, dacă "/usr/local/acme/clase" este în calea de clase, atunci când JVM se pare pentru o clasa numita com.acme.exemplu.Foon, se va uita pentru o ".clasa" fișier cu acest nume de cale:

  /usr/local/acme/classes/com/acme/example/Foon.class

Dacă ai fi pus "/usr/local/acme/clase/com/acme/exemplu" pe clase, apoi JVM n't fi capabil de a găsi clasa. Motivul #2b - subdirectorul cale nu't se potrivi FQN

În cazul în clase FQN este com.acme.exemplu.Foon, apoi JVM este de gând să se uite pentru "Foon.clasa" în directorul "com/acme/exemplu":

  • În cazul în structura de directoare se't se potrivesc pachetul de numire ca pe modelul de mai sus, JVM câștigat't găsi clasa ta.
  • Dacă încercați redenumire o clasă de mișcare, că nu va reuși la fel de bine ... dar excepția stacktrace va fi diferit. Este susceptibilă de a spune ceva de genul: Cauzate de: java.lang.NoClassDefFoundError: (greșit numele: ) pentru că FQN în clasa file nu't să se potrivească cu ce clasa loader este așteptam să găsesc. Pentru a da un exemplu concret, să presupunem că:
  • vrei să fugi `com.acme.exemplu.Foon clasa,
  • toată calea de fișier este /usr/local/acme/classes/com/acme/example/Foon.class,
  • ți director de lucru curent este /usr/local/acme/clase/com/acme/exemplu/, apoi:
# wrong, FQN is needed
java Foon

# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon

# wrong, similar to above
java -classpath . com.acme.example.Foon

# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Note:

  • La -classpath opțiune poate fi scurtat la cp în cele mai multe versiuni Java. Verificați respectiv intrările manuale pentru java, javac și așa mai departe.

  • Cred că cu atenție atunci când aleg între absolut și relativ de cai de acces în căi. Amintiți-vă că o rudă pathname poate "pauză" dacă directorul curent de modificări. Motivul #2c - dependențe lipsesc din classpath

    Classpath trebuie să includă toate alte (non-sistem) clasele că cererea dumneavoastră depinde. (Sistemul clase sunt situate în mod automat, și rareori trebuie să vă faceți griji cu asta.) Pentru clasa principală pentru a încărca corect, JVM trebuie să găsească:

  • clasa în sine.

  • toate clasele și interfețele în superclasa ierarhie (de exemplu, a se vedea https://stackoverflow.com/questions/42880748)

  • toate clasele și interfețele care sunt menționate prin intermediul unor variabile sau declarații de variabile, sau apel de metodă sau accesul la teren expresii. (Notă: JLS și JVM caietul de sarcini permite un domeniu de aplicare pentru un JVM pentru a încărca clase "alene", iar acest lucru poate afecta atunci când un agent excepție este aruncată.) Motivul #3 - clasa a fost declarată în pachetul greșit

    Ocazional se întâmplă pune cineva un fișier de cod sursă în dosarul greșit în codul lor sursă de copac, sau vor uita de "pachet" declarația. Dacă veți face acest lucru într-un IDE, IDE's compilatorul va spune despre asta imediat. În mod similar, dacă utilizați un decent Java build tool, instrumentul va rula javac într-un mod care va detecta problema. Cu toate acestea, dacă vă construi codul Java de mână, poți face în așa fel încât compilatorul nu't observa problema, și care rezultă ".clasa" fișier nu este în locul în care te aștepți să fie. Încă mai pot't găsi problema?

    Există o mulțime de lucruri pentru a verifica, și este ușor să pierdeți ceva. Încercați să adăugați -Xdiag opțiunea java în linia de comandă (ca primul lucru dupa java). Se va afișa diverse lucruri despre clasa de încărcare, și acest lucru poate oferi indicii cu privire la ceea ce este cu adevărat problema. De asemenea, ia în considerare posibilele probleme cauzate de copierea și lipirea invizibil sau caractere non-ASCII de la site-uri web, documente și așa mai departe. Și ia în considerare "omografe", au fost două litere sau simboluri arata la fel ... dar nu't.

    Anii `java-jar sintaxa

    Alternativa sintaxa folosită pentru "executabil" fișierele JAR este după cum urmează:

  java [  ... ] -jar  [ ...]

de exemplu

  java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

În acest caz numele de intrare-punct de clasă (de exemplu, com.acme.exemplu.ListUser`) și clase sunt specificate în MANIFESTUL din fișierul JAR.

IDEs

Un tipic Java IDE are suport pentru rularea de aplicații Java în IDE JVM în sine sau într-un copil JVM. Acestea sunt în general imun la această excepție special, deoarece IDE foloseste propriile mecanisme pentru a construi clase de execuție, identificarea principalelor clasă și de a crea java în linia de comandă. Cu toate acestea, este încă posibil ca această excepție să apară, dacă faci lucruri spatele IDE. De exemplu, dacă ați configurat anterior un Lansator de Aplicație pentru aplicație Java în Eclipse, și apoi sa mutat fișierul JAR care conține "principal" clasă într-un loc diferit în sistemul de fișiere fără a spune Eclipse, Eclipsa ar involuntar lansa JVM cu un incorecte classpath. Pe scurt, dacă aveți această problemă într-un IDE, verificați pentru lucruri cum ar fi stătut IDE stat, rupt de proiect referințe sau rupt launcher configurații. Este de asemenea posibil pentru un IDE pentru a obține pur și simplu confuz. IDE's sunt extrem de complicate piese de software-ul cuprinde mai multe piese de interactiune. Multe dintre aceste părți să adopte diverse strategiile de memorare în cache, în scopul de a face IDE ca un întreg receptiv. Acestea pot merge, uneori, greșit, și un posibil simptom este probleme la lansarea de aplicații. Dacă bănuiți că acest lucru ar putea întâmpla, este în valoare de încercarea de lucruri minciună reporniți IDE și de refacere a proiectului.

Alte Referințe

Comentarii (11)

Dacă sursa ta nume de cod este HelloWorld.java ta cod compilat va fi HelloWorld.class.

Veți obține acea eroare, dacă te sun, folosind:

java HelloWorld.class

În schimb, utilizați acest:

java HelloWorld
Comentarii (8)

În cazul în care clasele sunt în pachete apoi trebuie să cd la directorul rădăcină al proiectului dumneavoastră și a alerga folosind numele complet calificat al clasei (numepachet.MainClassName).

Exemplu:

Cursurile mele sunt aici:

D:\project\com\cse\

Numele complet calificat al meu de clasa principala este:

com.cse.Main

Așa că am " cd " înapoi la rădăcini director de proiect:

D:\project

Apoi problema java comanda:

java com.cse.Main

Acest răspuns este pentru salvarea newbie programatori java de frustrarea cauzată de o greșeală comună, vă recomand să citiți răspunsul acceptat pentru mai multe cunoștințe aprofundate despre java-classpath.

Comentarii (2)

Dacă definiți principalele clasă și principala metodă într-un "pachet", ar trebui să rulați peste ierarhică de directoare, folosind numele complet al clasei (numepachet.MainClassName).

Presupun că există un fișier de cod sursă (Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Pentru a rula acest cod, tu ar trebui să pună Main.Class în pachet ca director./com/test/Main.Java. Și în directorul rădăcină folosesc java com.test.Principal.

Comentarii (6)

Când același cod funcționează pe un PC, dar se prezinta eroare în alta, cea mai bună soluție am găsit vreodată este compilarea cum ar fi următoarele:

javac HelloWorld.java
java -cp . HelloWorld
Comentarii (5)

Ce m-a ajutat a fost specificarea clase pe linia de comandă, de exemplu:

  1. Creați un folder nou, C:\temp

  2. Creați fișiere Temp.java în C:\temp`, cu următoarele clasă în ea:

public class Temp { public static void main(String args[]) { Sistem.afară.println(args[0]); } }

  1. Deschideți o linie de comandă în dosarul C:\temp și scrieți următoarea comandă pentru a compila Temp clasa:

javac Temp.java

  1. Rula Java compilat clasa, adăugând -classpath opțiune pentru a permite JRE știu unde să găsească clasa:

java -classpath C:\temp Temp Buna ziua!

Comentarii (7)

Potrivit mesaj de eroare ("nu a Putut găsi sau sarcina principală de clasa"), există două categorii de probleme:

  1. Clasa principală nu ar putea fi descoperit
  2. Clasa principală nu ar putea fi încărcat (acest caz nu este pe deplin discutat în răspunsul acceptat)

Clasa principală nu ar putea fi descoperit atunci când nu există greșeală de scriere sau greșit sintaxă în numele complet al clasei sau nu există în condiția classpath.

Clasa principală nu ar putea fi încărcat la clasa nu poate fi inițiată, de obicei, principala clasa extinde o altă clasă și clasă nu există în condiția classpath.

De exemplu:

public class YourMain extends org.apache.camel.spring.Main

Dacă cămilă-primăvară nu este inclus, această eroare va fi raportat.

Comentarii (11)

Am avut o astfel de eroare în acest caz:

java -cp lib.jar com.mypackage.Main

Acesta funcționează cu ; pentru Windows și : pentru Unix:

java -cp lib.jar; com.mypackage.Main
Comentarii (2)

Utilizați această comandă:

java -cp . [PACKAGE.]CLASSNAME

Exemplu: Dacă classname este Hello.class creat de Hello.java apoi utilizați comanda de mai jos:

java -cp . Hello

Dacă fișierul dvs. Hello.java este în interiorul pachetului com.demo apoi utilizați comanda de mai jos

java -cp . com.demo.Hello

Cu JDK 8 de multe ori se întâmplă că clasa de fișier este prezent în același dosar, dar java comanda se așteaptă clase și pentru acest motiv vom adăuga -cp . pentru a lua folderul curent ca referință pentru classpath.

Comentarii (8)

Uneori, ceea ce ar putea cauza problema nu are nimic de-a face cu clasa principală, și am avut de a găsi acest lucru la fel de greu. A fost o referire bibliotecă care m-am mutat, si mi-a dat:

nu a Putut găsi sau de sarcină principală clasa xxx Linux

Am șters doar ca referință, a adăugat ea din nou, și a mers din nou bine.

Comentarii (5)

Încercați -Xdiag.

Steve C's a răspunde se referă la posibile cazuri de frumos, dar, uneori, pentru a determina dacă o clasă nu a putut fi găsit sau încărcat* ar putea să nu fie atât de ușor. Folosiți java -Xdiag (din JDK 7). Acest lucru imprimă o frumos stacktrace care oferă un indiciu pentru ce mesajul nu a Putut găsi sau sarcina principală de clasă înseamnă mesajul.

De exemplu, ea poate indica la alte clase folosite de principalele clasa care nu a putut fi găsit și împiedicat clasa principală de a fi încărcate.

Comentarii (0)

În acest caz, trebuie:

nu a Putut găsi sau de sarcină principală class ?classpath

L's pentru că sunteți folosind "-classpath", dar la bord nu este același lucru dash folosit de java la promptul de comandă. Am avut această problemă copierea și lipirea din Notepad pentru cmd.

Comentarii (1)

Am avut aceeași problemă și a găsit în sfârșit greseala mea :) Am folosit această comandă pentru întocmirea și ea a lucrat în mod corect:

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

Dar această comandă nu au de lucru pentru mine (nu am putut găsi sau de a încărca clasa principală, qrcode):

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

În cele din urmă am adăugat doar ':' caracter la sfârșitul clasei și problema a fost rezolvată:

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
Comentarii (0)

În cazul meu, eroare apărut pentru că am avut furnizate de sursa de nume de fișier în loc de nume de clasă.

Trebuie să furnizeze numele clasei care conține metoda main pentru interpret.

Comentarii (1)

Acest lucru ar putea ajuta dacă cazul este exact ca a mea: ca un incepator am fugit, de asemenea, în această problemă, atunci când am încercat pentru a rula un program Java.

Am compilat astfel:

javac HelloWorld.java

Și am încercat să fug, de asemenea, cu aceeași extensie:

java Helloworld.java

Cand am scos .java și rescris comandă cum ar fi java HelloWorld, programul s-a desfășurat perfect. :)

Comentarii (2)

Clasa de fișier de locație: C:\test\com\company

Nume De Fișier: Main.class

Complet calificat nume de clasă: com.compania.Principalele

În linia de comandă comandă:

java  -classpath "C:\test" com.company.Main

Rețineți aici că class cale NU include \com\companie

Comentarii (0)

Mi-am petrecut o sumă decentă de timp încercând să rezolve această problemă. Am crezut că am fost într-un fel mi-classpath incorect dar problema a fost că am scris:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

în loc de:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Am crezut că sensul deplin calificat menit să includă calea completă și numele în loc de pachetul complet numele.

Comentarii (2)

Primul set de cale folosind această comandă;

set path="paste the set path address"

Apoi, aveți nevoie pentru a încărca programul. Tip "cd (nume folder)" în stocat conduce și-l compilați. De Exemplu, dacă programul meu stocate pe unitatea D, de tip "D:" apăsați enter și introduceți " cd (nume folder)".

Comentarii (3)

Ce sa rezolvat problema în cazul meu a fost:

Click dreapta pe proiect/clasa doriți să rulați, apoi Fugi Ca-> Run Configurații. Apoi, ar trebui să fie repare configurația existentă sau pentru a adăuga noi în felul următor:

deschide Clase tab, faceți clic pe "Avansat..." butonul, apoi se adaugă bin folder din proiect.

Comentarii (0)

Toate răspunsurile aici sunt îndreptate spre utilizatorii de Windows se pare. Pentru Mac, classpath separator este :, nu ;. Ca o eroare de setare classpath folosind ; nu este aruncat atunci acest lucru poate fi dificil de a descoperi în cazul în care vine de la Windows la Mac.

Aici este corespunzătoare Mac comanda:

java -classpath ".:./lib/*" com.test.MyClass

În cazul în care în acest exemplu este pachetul com.test` și o " lib " dosar este, de asemenea, să fie incluse pe clase.

Comentarii (3)