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?
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 [ <option> ... ] <class-name> [<argument> ...]
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 `
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:
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 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:
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
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ția java
comanda. Verificați că numele de directoare și fișiere JAR denumiri sunt corecte. java
comanda. ;
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
Î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: # 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.
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)
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? -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. Alternativa sintaxa folosită pentru "executabil" fișierele JAR este după cum urmează:
java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
de exemplu
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
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. Î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.
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
.
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:
public class YourMain extends org.apache.camel.spring.Main
Dacă cămilă-primăvară nu este inclus, această eroare va fi raportat.
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.
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.
Î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.
Î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.
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
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. :)
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
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.
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)".
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:
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.