Mai mult
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?
1270
45
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:
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,Cu toate acestea unele versiuni de java comandă permite să utilizați slash-uri în loc de perioade; de exemplu,
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:De mai sus este de gând să provoca java comandă pentru a face următoarele:
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ă că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 argumentPrimul 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:
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.ListUserExemplu #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:java
comanda documentațiajava
comanda. Verificați că numele de directoare și fișiere JAR denumiri sunt corecte.java
comanda.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 claseCâ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: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":/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/clase/com/acme/exemplu/
, apoi:Note:
La
-classpath
opțiune poate fi scurtat lacp
în cele mai multe versiuni Java. Verificați respectiv intrările manuale pentrujava
,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țiuneajava
în linia de comandă (ca primul lucru dupajava
). 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ă:
de exemplu
Î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
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:
În schimb, utilizați acest:
Î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:
Numele complet calificat al meu de clasa principala este:
Așa că am " cd " înapoi la rădăcini director de proiect:
Apoi problema
java
comanda: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.
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):
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
.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:
Ce m-a ajutat a fost specificarea clase pe linia de comandă, de exemplu:
Creați un folder nou,
C:\temp
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]); } }
C:\temp
și scrieți următoarea comandă pentru a compila Temp clasa:javac Temp.java
-classpath
opțiune pentru a permite JRE știu unde să găsească clasa:java -classpath C:\temp Temp Buna ziua!
Potrivit mesaj de eroare ("nu a Putut găsi sau sarcina principală de clasa"), există două categorii de probleme:
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:
Dacă cămilă-primăvară nu este inclus, această eroare va fi raportat.
Am avut o astfel de eroare în acest caz:
Acesta funcționează cu
;
pentru Windows și:
pentru Unix:Utilizați această comandă:
Exemplu: Dacă classname este Hello.class creat de Hello.java apoi utilizați comanda de mai jos:
Dacă fișierul dvs. Hello.java este în interiorul pachetului com.demo apoi utilizați comanda de mai jos
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.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:
Am șters doar ca referință, a adăugat ea din nou, și a mers din nou bine.
Î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 mesajulnu 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.
În acest caz, trebuie:
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.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:
Dar această comandă nu au de lucru pentru mine (nu am putut găsi sau de a încărca clasa principală,
qrcode
):În cele din urmă am adăugat doar ':' caracter la sfârșitul clasei și problema a fost rezolvată:
Î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.
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:
Și am încercat să fug, de asemenea, cu aceeași extensie:
Cand am scos
.java și rescris comandă cum ar fi java HelloWorld
, programul s-a desfășurat perfect. :)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ă:
Rețineți aici că class cale NU include \com\companie
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:
în loc de:
Am crezut că sensul deplin calificat menit să includă calea completă și numele în loc de pachetul complet numele.
Primul set de cale folosind această comandă;
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)".
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.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:
În cazul în care în acest exemplu este pachetul com.test` și o " lib " dosar este, de asemenea, să fie incluse pe clase.