Bieži sastopama problēma, ar ko saskaras jaunie Java izstrādātāji, ir tā, ka viņu programmas neizdodas palaist ar kļūdas paziņojumu: Nevar atrast vai ielādēt galveno klasi ...
Ko tas nozīmē, kas to izraisa un kā to novērst?
java <class-name>
sintakseVispirms jums jāizprot, kā pareizi palaist programmu, izmantojot java
(vai javaw
) komandu.
Parastā sintakse1 ir šāda:
java [ <option> ... ] <class-name> [<argument> ...]
kur <opcija>
ir komandrindas opcija (sākas ar "-" rakstzīmi), <klases nosaukums>
ir pilnīgs Java klases vārds, un <arguments>
ir patvaļīgs komandrindas arguments, kas tiek nodots jūsu programmai.
1 - Pastāv otra JAR failu "izpildāmo failu" sintakse, kuru es aprakstīšu apakšā.
Pilnīgi kvalificēto klases nosaukumu (FQN) tradicionāli raksta tāpat, kā to rakstītu Java avota kodā; piem.
packagename.packagename2.packagename3.ClassName
Tomēr dažās java
komandas versijās periodu vietā var lietot slīpsvītras; piem.
packagename/packagename2/packagename3/ClassName
kas (mulsinoši) izskatās kā faila ceļa vārds, bet tāds nav. Ievērojiet, ka termins pilnīgi kvalificēts vārds ir standarta Java terminoloģija ... nevis kaut kas, ko es vienkārši izdomāju, lai jūs maldinātu :-)
Lūk, piemērs, kā jāizskatās java
komandai:
java -Xmx100m com.acme.example.ListUsers fred joe bert
Iepriekš minētais java
komandai java
veiks šādas darbības:
com.acme.example.ListUsers
klases versiju.main
metode ar parakstu, atgriešanas tipu un modifikatoriem, kas norādīti ar public static void main(String[])
. (Ņemiet vērā, ka metodes argumenta nosaukums nav paraksta daļa.)String[]
.
Iemesli, kāpēc Java nevar atrast klasijava
nespēja atrast klasi. Un patiešām, "..." ziņojumā būs pilnīgi kvalificēts klases nosaukums, ko java
meklē.
Tad kāpēc tā nevar atrast klasi?Pirmais iespējamais iemesls ir tas, ka, iespējams, esat norādījis nepareizu klases nosaukumu. (Vai ... pareizo klases nosaukumu, bet nepareizā formā.) Ņemot vērā iepriekš minēto piemēru, šeit ir minēti dažādi nepareizi veidi, kā norādīt klases nosaukumu:
Piemērs Nr. 1 - vienkāršs klases nosaukums:
java ListUser
Ja klase ir deklarēta pakotnē, piemēram, com.acme.example
, tad komandā java
jāizmanto pilns klases nosaukums, ieskaitot pakotnes nosaukumu; piem.
java com.acme.example.ListUser
Piemērs Nr. 2 - faila vai ceļa nosaukums, nevis klases nosaukums: java ListUser.class java com/acme/example/ListUser.class
Piemērs #4 - pārrakstīšanās kļūda java com.acme.example.mistuser
Piemērs #5 - avota faila nosaukums java ListUser.java
Piemērs #6 - jūs pilnībā aizmirsāt klases nosaukumu java daudz argumentu
Otrs iespējamais iemesls ir tāds, ka klases nosaukums ir pareizs, bet java
komanda nevar atrast klasi. Lai to saprastu, ir jāizprot jēdziens "classpath". Oracle dokumentācijā tas ir labi izskaidrots:
java
command documentation.java
komandu. Pārbaudiet, vai direktoriju nosaukumi un JAR failu nosaukumi ir pareizi.java
komandu.;
operētājsistēmā Windows un :
pārējās operētājsistēmās. Ja izmantojat nepareizu atdalītāju savai platformai, jūs nesaņemsiet skaidru kļūdas ziņojumu. Tā vietā ceļā parādīsies neesošs fails vai direktorija, kas tiks ignorēta.)
2.a iemesls - klases ceļā ir nepareiza direktorijaKad direktoriju ievietojat klasesceliņā, tas nosacīti atbilst kvalificētās vārdu telpas saknei. Klases tiek izvietotas direktoriju struktūrā zem šīs saknes, pārveidojot pilnībā kvalificēto nosaukumu uz ceļa vārdu. Piemēram, ja "/usr/local/acme/classes" ir klases ceļā, tad, kad JVM meklē klasi ar nosaukumu com.acme.example.Foon
, tas meklēs ".class" failu ar šo ceļa nosaukumu:
/usr/local/acme/classes/com/acme/example/Foon.class
Ja jūsu klases FQN ir com.acme.example.Foon
, tad JVM meklēs "Foon.class" direktorijā "com/acme/example":
com.acme.example.Foon
klasi,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,
tad:# 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
Piezīmes:
Vairumā Java versiju -classpath
opciju var saīsināt līdz -cp
. Pārbaudiet attiecīgos rokasgrāmatas ierakstus par java
, javac
un tā tālāk.
Klases ceļā ir jāiekļauj visas pārējās (ne sistēmas) klases, no kurām ir atkarīga jūsu lietojumprogramma. (Sistēmas klases tiek izvietotas automātiski, un jums reti kad par to ir jārūpējas). Lai galvenā klase tiktu ielādēta pareizi, JVM ir jāatrod:
pašu klasi.
visas klases un saskarnes virsklases hierarhijā (piemēram, skatīt https://stackoverflow.com/questions/42880748).
visas klases un saskarnes, uz kurām atsaucas, izmantojot mainīgo vai mainīgo deklarācijas, vai metodes izsaukuma vai lauka piekļuves izteiksmes. (Piezīme: JLS un JVM specifikācijas pieļauj, ka JVM var ielādēt klases "laiski", un tas var ietekmēt to, kad tiek izmests klases ielādētāja izņēmums).
paketes
deklarāciju. Ja jūs to darāt kādā IDE, IDE kompilators uzreiz par to paziņos. Līdzīgi, ja jūs izmantojat pienācīgu Java kompilēšanas rīku, tas palaidīs javac
tā, lai atklātu šo problēmu. Tomēr, ja veidojat savu Java kodu ar rokām, varat to darīt tā, ka kompilators šo problēmu nepamanīs, un rezultātā izveidotais ".class" fails neatradīsies tajā vietā, kur tas ir paredzēts.
Joprojām nevarat atrast problēmu?-Xdiag
opciju java
komandrindai (kā pirmo pēc java
). Tā izvadīs dažādus datus par klašu ielādēšanu, un tas var sniegt jums norādes par to, kas ir īstā problēma.
Apsveriet arī iespējamās problēmas, ko izraisa neredzamu vai neASCII rakstzīmju kopēšana un ielīmēšana no tīmekļa vietnēm, dokumentiem utt. Un apsveriet "homoglifus", kad divi burti vai simboli izskatās vienādi... bet tā nav.java -jar <jar file>
Alternatīvā sintakse, ko izmanto "izpildāmiem" JAR failiem, ir šāda:
java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
piem.
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
com.acme.example.ListUser
) un klases ceļš.java
komandrindu.
Tomēr joprojām ir iespējams, ka šis izņēmums var rasties, ja kaut ko darāt aiz IDE muguras. Piemēram, ja iepriekš Eclipse ir iestatīts lietojumprogrammas palaišanas palaidējs savai Java lietojumprogrammai un pēc tam JAR fails, kurā ir "main" klase, ir pārvietots uz citu vietu failu sistēmā neinformējot Eclipse, Eclipse neapzināti palaistu JVM ar nepareizu klases ceļu.
Īsi sakot, ja šī problēma rodas IDE, pārbaudiet, vai IDE stāvoklis nav novecojis, vai nav bojātas projekta atsauces vai palaišanas konfigurācijas.
Ir arī iespējams, ka IDE ir vienkārši sajaukta. IDE ir ārkārtīgi sarežģīta programmatūra, kas sastāv no daudzām savstarpēji mijiedarbojošām daļām. Daudzas no šīm daļām izmanto dažādas kešēšanas stratēģijas, lai padarītu IDE kā veselumu atsaucīgu. Dažreiz tās var būt nepareizas, un viens no iespējamiem simptomiem ir problēmas lietojumprogrammu palaišanas laikā. Ja jums ir aizdomas, ka tā varētu notikt, ir vērts izmēģināt IDE restartēšanu un projekta pārbūvi.Dažreiz problēmas cēlonis var nebūt saistīts ar galveno klasi, un man nācās to noskaidrot grūtā ceļā. Tā bija atsauce uz bibliotēku, kuru es pārcēlu, un tā man parādīja:
Nevarēja atrast vai ielādēt galveno klasi xxx Linux
Es vienkārši dzēsu šo atsauci, pievienoju to no jauna, un viss atkal darbojās pareizi.
Vispirms iestatiet ceļu, izmantojot šo komandu;
set path="paste the set path address"
Pēc tam ielādējiet programmu. Ierakstiet "cd (mapes nosaukums)" saglabātajā diskā un kompilējiet to. Piemēram, ja mana programma ir saglabāta D diskā, ierakstiet "D:" nospiediet enter un ierakstiet " cd (mapes nosaukums)".