නව ජාවා සංවර්ධකයින් අත්විඳින පොදු ගැටළුවක් නම් ඔවුන්ගේ වැඩසටහන් දෝෂ පණිවිඩය සමඟ ක්රියාත්මක වීමට අසමත් වීමයි: Could not find or load main class ...
මෙයින් අදහස් කරන්නේ කුමක්ද, එයට හේතුව කුමක්ද සහ ඔබ එය නිවැරදි කළ යුත්තේ කෙසේද?
නව ජාවා සංවර්ධකයින් අත්විඳින පොදු ගැටළුවක් නම් ඔවුන්ගේ වැඩසටහන් දෝෂ පණිවිඩය සමඟ ක්රියාත්මක වීමට අසමත් වීමයි: Could not find or load main class ...
මෙයින් අදහස් කරන්නේ කුමක්ද, එයට හේතුව කුමක්ද සහ ඔබ එය නිවැරදි කළ යුත්තේ කෙසේද?
Answers:
java <class-name>
විධානය කාරක රීතිපළමුවෙන්ම, java
(හෝ javaw
) විධානය භාවිතා කරමින් වැඩසටහනක් දියත් කිරීමට නිවැරදි ක්රමය ඔබ තේරුම් ගත යුතුය .
සාමාන්ය සින්ටැක්ස් 1 මෙයයි:
java [ <options> ] <class-name> [<arg> ...]
එහිදී <option>
විධාන රේඛාව විකල්පය (සමඟ ආරම්භ "-" චරිතය) ඇත, <class-name>
පූර්ණ සුදුසුකම් ලත් ජාවා පන්තිය නම වන අතර, <arg>
ඔබේ අයදුම් කිරීමට සමත් රැඳි හිතුවක්කාරී විධාන රේඛාව තර්කයකි.
1 - මෙම පිළිතුර අවසානයේ විස්තර කර ඇති තවත් වාක්ය ඛණ්ඩ කිහිපයක් තිබේ.
පංතිය සඳහා සම්පුර්ණ සුදුසුකම් ලත් නම (FQN) සාම්ප්රදායිකව ඔබ ජාවා ප්රභව කේතයෙන් ලියා ඇත; උදා
packagename.packagename2.packagename3.ClassName
කෙසේ වෙතත්, java
විධානයෙහි සමහර අනුවාදයන් ඔබට කාල පරිච්ඡේද වෙනුවට කප්පාදු භාවිතා කිරීමට ඉඩ දෙයි; උදා
packagename/packagename2/packagename3/ClassName
එය (ව්යාකූල ලෙස) ගොනු මාර්ග නාමයක් මෙන් පෙනේ, නමුත් එකක් නොවේ. සම්පුර්ණ සුදුසුකම් ලත් නම සම්මත ජාවා පාරිභාෂිතය බව සලකන්න ... ඔබව ව්යාකූල කිරීමට මා විසින් සාදන ලද දෙයක් නොවේ :-)
java
විධානයක් කෙබඳු විය යුතුද යන්න පිළිබඳ උදාහරණයක් මෙන්න :
java -Xmx100m com.acme.example.ListUsers fred joe bert
ඉහත දැක්වෙන්නේ java
විධානය පහත සඳහන් දේ කිරීමට හේතු වනු ඇත :
com.acme.example.ListUsers
පන්තියේ සම්පාදිත අනුවාදය සොයන්න .main
ක්රමයක් තිබේදැයි පරීක්ෂා කරන්න . (සටහන, ක්රම තර්කයේ නම අත්සනෙහි කොටසක් නොවේ .)public static void main(String[])
String[]
.ඔබට "ප්රධාන පන්තිය සොයා ගැනීමට හෝ පූරණය කිරීමට නොහැකි විය ..." යන පණිවිඩය ලැබුණු විට, එයින් අදහස් වන්නේ පළමු පියවර අසාර්ථක වී ඇති බවයි. මෙම java
විධානය පන්ති සොයා ගැනීමට නොහැකි විය. ඇත්ත වශයෙන්ම, පණිවිඩයේ ඇති "..." සම්පූර්ණ සුදුසුකම් ලත් පන්තියේ නම වනු ඇත බව java
හොයනවා.
එසේ නම් එය පන්තිය සොයා ගැනීමට නොහැකි වන්නේ ඇයි?
පළමු හේතුව විය හැක්කේ ඔබ වැරදි පන්තියේ නම ලබා දී තිබීමයි. (හෝ ... නිවැරදි පංතියේ නම, නමුත් වැරදි ස්වරූපයෙන්.) ඉහත උදාහරණය සලකා බැලීමේදී , පන්තියේ නම සඳහන් කිරීමට විවිධ වැරදි ක්රම මෙන්න :
උදාහරණ # 1 - සරල පන්ති නාමයක්:
java ListUser
වැනි පැකේජයක් තුළ පන්තිය ප්රකාශයට පත් කළ විට com.acme.example
, ඔබ විධානයෙහි ඇති පැකේජයේ නම ඇතුළුව සම්පූර්ණ පන්ති නාමය භාවිතා කළ යුතුය java
; උදා
java com.acme.example.ListUser
උදාහරණ # 2 - පන්ති නාමයකට වඩා ගොනු නාමයක් හෝ මාර්ග නාමයක්:
java ListUser.class
java com/acme/example/ListUser.class
උදාහරණ # 3 - ආවරණයක් වැරදියි පන්තියේ නම:
java com.acme.example.listuser
උදාහරණ # 4 - යතුරු ලියනයකි
java com.acme.example.mistuser
උදාහරණ # 5 - ප්රභව ගොනු නාමයක් (ජාවා 11 හෝ ඊට පසුව හැර; පහත බලන්න)
java ListUser.java
උදාහරණ # 6 - ඔබට පන්තියේ නම මුළුමනින්ම අමතක විය
java lots of arguments
දෙවන හේතුව පංතියේ නම නිවැරදි නමුත් java
විධානයට පන්තිය සොයාගත නොහැකි වීමයි. මෙය තේරුම් ගැනීම සඳහා, ඔබ "පන්තියේ මාවත" පිළිබඳ සංකල්පය තේරුම් ගත යුතුය. ඔරකල් ප්රලේඛනය මගින් මෙය හොඳින් පැහැදිලි කරයි:
java
විධානය ප්රලේඛනයඉතින් ... ඔබ පන්තියේ නම නිවැරදිව සඳහන් කර ඇත්නම්, ඊළඟට පරීක්ෂා කර බැලිය යුත්තේ ඔබ පන්ති මාර්ගය නිවැරදිව නියම කර ඇති බවයි:
java
. නාමාවලි නාම සහ JAR ගොනු නම් නිවැරදි දැයි පරීක්ෂා කරන්න.java
විධානය.;
Windows මත හා :
අනිත් අය මත. ඔබ ඔබේ වේදිකාව සඳහා වැරදි වෙන්කර භාවිතා කරන්නේ නම්, ඔබ පැහැදිලි දෝෂ ලබා ගැනීමට නොහැකි වනු ඇත. ඒ වෙනුවට, ඔබ නිහඬව නොසලකා හැරෙන බව මාර්ගය මත ශුන්ය ගොනුවට හෝ ඩිරෙක්ටරියට ලැබෙනු ඇත .)ඔබ පන්තියේ මාර්ගයට නාමාවලියක් දැමූ විට, එය සුදුසුකම් ලත් නාම අවකාශයේ මූලයට අනුරූප වේ. සම්පුර්ණ සුදුසුකම් ලත් නම මාර්ග නාමයකට අනුරූපණය කිරීමෙන් පන්ති එම මූලයට යටින් ඇති නාමාවලි ව්යුහයේ පිහිටා ඇත . උදාහරණයක් ලෙස, "/ usr / local / acme / classes" පන්ති මාවතේ තිබේ නම්, ජේවීඑම් විසින් පංතියක් සොයන විට com.acme.example.Foon
, එය මෙම මාර්ග නාමය සහිත ".class" ගොනුවක් සොයනු ඇත:
/usr/local/acme/classes/com/acme/example/Foon.class
ඔබ පන්ති මාවතේ "/ usr / local / acme / classes / com / acme / example" දමා ඇත්නම්, එවිට JVM හට පන්තිය සොයාගත නොහැකි වනු ඇත.
ඔබේ පංති FQN නම් com.acme.example.Foon
, JVM "com / acme / example" නාමාවලියෙහි "Foon.class" සොයනු ඇත:
ඉහත රටාවට අනුව ඔබේ නාමාවලි ව්යුහය පැකේජ නාමකරණයට නොගැලපේ නම්, ජේවීඑම් ඔබේ පන්තිය සොයා නොගනී.
පංතියක් ගෙනයාමෙන් ඔබ එය නැවත නම් කිරීමට උත්සාහ කළහොත් එයද අසාර්ථක වනු ඇත ... නමුත් ව්යතිරේක ස්ටැක්ට්රේස් වෙනස් වේ. මේ වගේ දෙයක් කීමට බැඳී සිටී:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
පංති ගොනුවේ ඇති FQN පන්ති භාරකරු සොයා ගැනීමට බලාපොරොත්තු වන දේට නොගැලපෙන බැවිනි.
ස්ථිර උදාහරණයක් දීමට, එය උපකල්පනය කරමින්:
com.acme.example.Foon
පන්තිය ධාවනය කිරීමට අවශ්යයි ,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,එවිට:
# 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
සටහන්:
-classpath
විකල්පය කෙටි කළ හැකි -cp
බොහෝ ජාවා නිකුතුවකට. සඳහා අදාළ අත්පොත ඇතුළත් කිරීම් පරීක්ෂා කරන්න java
, javac
සහ එසේ ය.ඔබේ යෙදුම රඳා පවතින අනෙකුත් (පද්ධති නොවන) පන්ති සියල්ලම පන්ති පථයට ඇතුළත් කළ යුතුය. (පද්ධති පන්ති ස්වයංක්රීයව පිහිටා ඇති අතර ඔබ මේ ගැන සැලකිලිමත් විය යුත්තේ කලාතුරකිනි.) ප්රධාන පන්තිය නිවැරදිව පැටවීම සඳහා, ජේවීඑම් සොයා ගැනීම අවශ්ය වේ:
(සටහන: ජේඑල්එස් සහ ජේවීඑම් පිරිවිතරයන් ජේවීඑම් සඳහා "කම්මැලි" පන්ති පැටවීමට යම් ඉඩක් ලබා දේ. පංති පැටවුම් ව්යතිරේකයක් විසි කරන විට මෙය බලපායි.)
ඉඳහිට යමෙකු මූලාශ්ර කේත ගොනුවක් ඔවුන්ගේ ප්රභව කේත ගසෙහි වැරදි ෆෝල්ඩරයට දැමූ විට හෝ ඔවුන් package
ප්රකාශය අතහැර දමයි . ඔබ මෙය IDE එකක කරන්නේ නම්, IDE හි සම්පාදකයා වහාම මේ ගැන ඔබට කියනු ඇත. ඒ හා සමානව ඔබ හොඳ ජාවා තැනීමේ මෙවලමක් භාවිතා කරන්නේ නම්, මෙවලම javac
ගැටළුව හඳුනාගත හැකි ආකාරයකින් ක්රියාත්මක වේ. කෙසේ වෙතත්, ඔබ ඔබේ ජාවා කේතය අතින් සාදන්නේ නම්, ඔබට එය සම්පාදකයාට ගැටලුව නොපෙනෙන අයුරින් කළ හැකි අතර, එහි ප්රති ing ලයක් ලෙස ඇති “.class” ගොනුව ඔබ බලාපොරොත්තු වන ස්ථානයේ නොමැත.
පරීක්ෂා කිරීමට බොහෝ දේ ඇත, යමක් මග හැරීම පහසුය. විධාන රේඛාවට -Xdiag
විකල්පය එක් කිරීමට උත්සාහ කරන්න java
(පසු පළමු දෙය ලෙස java
). එය පන්ති පැටවීම පිළිබඳ විවිධ දේ ප්රතිදානය කරනු ඇති අතර සැබෑ ගැටළුව කුමක්ද යන්න පිළිබඳව මෙය ඔබට ඉඟි සපයයි.
තවද, වෙබ් අඩවි, ලේඛන සහ වෙනත් දේවලින් අදෘශ්යමාන හෝ ASCII නොවන අක්ෂර පිටපත් කර ඇලවීම නිසා ඇතිවිය හැකි ගැටළු සලකා බලන්න. "සමජාතීයතා" සලකා බලන්න, අකුරු දෙකක් හෝ සංකේත සමාන පෙනුමක් තිබුනද ... නමුත් එසේ නොවේ.
අවසාන වශයෙන්, ඔබ වැරදි අත්සන් සහිත JAR ගොනුවකින් දියත් කිරීමට උත්සාහ කළහොත් ඔබට මෙම ගැටලුවට මුහුණ දිය හැකිය (META-INF/*.SF)
.
java
ජාවා වැඩසටහන් දියත් කිරීම සඳහා විකල්ප සින්ටැක්ස් තුනක් ඇත java command
.
1) “ක්රියාත්මක කළ හැකි” JAR ගොනුවක් දියත් කිරීම සඳහා භාවිතා කරන සින්ටැක්ස් පහත පරිදි වේ:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
උදා
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
com.acme.example.ListUser
JAR ගොනුවේ MANIFEST හි ඇතුළත් කිරීමේ ලක්ෂ්ය පන්තියේ (එනම් ) සහ පන්ති පථයේ නම දක්වා ඇත.
2) මොඩියුලයකින් (ජාවා 9 සහ ඊට පසු) යෙදුමක් දියත් කිරීමේ වාක්ය ඛණ්ඩය පහත පරිදි වේ:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
පිවිසුම් ලක්ෂ්ය පන්තියේ නම එක්කෝ <module>
තමා විසින්ම නිර්වචනය කර ඇත, නැතහොත් විකල්පය මඟින් දෙනු ලැබේ <mainclass>
.
3) ජාවා 11 සිට, ඔබට තනි ප්රභව කේත ගොනුවක් සම්පාදනය කර ධාවනය කළ හැකි අතර පහත සඳහන් වාක්ය ඛණ්ඩය සමඟ එය ක්රියාත්මක කළ හැකිය:
java [ <options> ] <sourcefile> [<arg> ...]
".java" උපසර්ගය සහිත ගොනුවක් (සාමාන්යයෙන්).
වැඩි විස්තර සඳහා කරුණාකර java
ඔබ භාවිතා කරන ජාවා මුදා හැරීම සඳහා වන විධානය සඳහා නිල ලියකියවිලි බලන්න .
සාමාන්ය ජාවා IDE එකකට ජාවා යෙදුම් IDE JVM තුළම හෝ ළමා JVM තුළ ක්රියාත්මක කිරීමට සහාය වේ. මෙම සුවිශේෂී ව්යතිරේකයෙන් මේවා සාමාන්යයෙන් ප්රතිශක්තීකරනය වේ, මන්ද යත්, ධාවන කාල පංතිය තැනීමට, ප්රධාන පංතිය හදුනා ගැනීමට සහ java
විධාන රේඛාව නිර්මාණය කිරීමට IDE තමන්ගේම යාන්ත්රණ භාවිතා කරන බැවිනි .
කෙසේ වෙතත් ඔබ IDE පිටුපස පිටුපස දේවල් කරන්නේ නම් මෙම ව්යතිරේකය තවමත් සිදුවිය හැකිය. උදාහරණයක් ලෙස, ඔබ මීට පෙර ඔබේ ජාවා යෙදුම සඳහා යෙදුම් දියත් කිරීමක් සූර්යග්රහණයෙන් සකසා ඇත්නම් සහ ඔබ “ප්රධාන” පන්තිය අඩංගු JAR ගොනුව සූර්යග්රහණයට නොකියමින් ගොනු පද්ධතියේ වෙනත් ස්ථානයකට ගෙන ගියේ නම් , සූර්යග්රහණය නොදැනුවත්වම JVM දියත් කරනු ඇත. වැරදි පන්තියක් සමඟ.
කෙටියෙන් කිවහොත්, ඔබට මෙම ගැටළුව IDE එකකින් ලැබුනේ නම්, පැරණි IDE තත්ත්වය, බිඳුණු ව්යාපෘති යොමු කිරීම් හෝ කැඩුණු දියත් වින්යාසයන් වැනි දෑ පරීක්ෂා කරන්න.
IDE එකකට හුදෙක් ව්යාකූලත්වයට පත්විය හැකිය. IDE යනු බොහෝ අන්තර්ක්රියාකාරී කොටස් වලින් සමන්විත ඉතා සංකීර්ණ මෘදුකාංගයකි. මෙම කොටස් බොහොමයක් IDE සමස්තයක් ලෙස ප්රතිචාර දැක්වීම සඳහා විවිධ හැඹිලි ක්රමෝපායන් අනුගමනය කරයි. මේවා සමහර විට වැරදියට සිදුවිය හැකි අතර, යෙදුම් දියත් කිරීමේදී ඇතිවිය හැකි එක් රෝග ලක්ෂණයකි. මෙය සිදුවිය හැකි යැයි ඔබ සැක කරන්නේ නම්, ඔබේ IDE නැවත ආරම්භ කිරීම, ව්යාපෘතිය නැවත ගොඩනැඟීම සහ වෙනත් දේ උත්සාහ කිරීම වටී.
java -cp ../third-party-library.jar com.my.package.MyClass
; මෙය ක්රියා නොකරයි, ඒ වෙනුවට දේශීය ෆෝල්ඩරය පන්ති මාවතට එක් කිරීම අවශ්ය වේ (මේ අනුව වෙන් කර ඇත :
: java -cp ../third-party-library.jar:. com.my.package.MyClass
, එවිට එය ක්රියාත්මක විය යුතුය
java
ආනයනික පංතියක් සොයා නොගනී යැයි පැවසීම කනගාටුවට කරුණකි , ඒ වෙනුවට ඔබ ධාවනය කිරීමට උත්සාහ කරන ප්රධාන පන්තිය. මෙය නොමඟ යවන සුළුය, නමුත් මට විශ්වාසයි ඒ සඳහා හේතුවක් තිබේ. java
මගේ පන්තිය කොහේදැයි හරියටම දැන සිටි නඩුව මට තිබුණි , කෙසේ වෙතත් එයට ආනයනික පන්ති වලින් එකක් සොයාගත නොහැකි විය. එය පවසනවා වෙනුවට, එය මගේ ප්රධාන පන්තිය සොයා නොගැනීම ගැන පැමිණිලි කළේය. ඇත්තටම කරදරයක්.
ඔබේ ප්රභව කේත නාමය HelloWorld.java නම්, ඔබේ සම්පාදනය කළ කේතය වනු ඇත HelloWorld.class
.
ඔබ එය භාවිතා කර එය අමතන්නේ නම් ඔබට එම දෝෂය ලැබෙනු ඇත:
java HelloWorld.class
ඒ වෙනුවට, මෙය භාවිතා කරන්න:
java HelloWorld
javac TestCode.java
පසුවjava TestCode
java -classpath . HelloWorld
ඔබේ පන්ති පැකේජවල තිබේ නම්, ඔබ cd
ඔබේ ව්යාපෘතියේ මූල නාමාවලිය වෙත ගොස් පන්තියේ සම්පූර්ණ සුදුසුකම් සහිත නම භාවිතා කර ධාවනය කළ යුතුය (packageName.MainClassName).
උදාහරණයක්:
මගේ පන්ති මෙහි ඇත:
D:\project\com\cse\
මගේ ප්රධාන පන්තියේ සම්පූර්ණ සුදුසුකම් ලත් නම:
com.cse.Main
එබැවින් මම cd
නැවත මූල ව්යාපෘති නාමාවලිය වෙත:
D:\project
ඉන්පසු java
විධානය නිකුත් කරන්න :
java com.cse.Main
මෙම පිළිතුර පොදු වැරැද්දක් නිසා ඇති වූ කලකිරීමෙන් නවක ජාවා ක්රමලේඛකයින් ගලවා ගැනීම සඳහා වන අතර, ජාවා පන්තියේ මාවත පිළිබඳ ගැඹුරු දැනුමක් සඳහා පිළිගත් පිළිතුර කියවීමට මම නිර්දේශ කරමි.
ඔබ ප්රධාන පන්තිය සහ ප්රධාන ක්රමය a හි අර්ථ දක්වන්නේ නම්package
, ඔබ එය ධූරාවලි නාමාවලිය හරහා ධාවනය කළ යුතුය, පන්තියේ සම්පූර්ණ නම භාවිතා කරමින් ( packageName.MainClassName
).
ප්රභව කේත ගොනුවක් ඇතැයි සිතන්න (Main.java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
මෙම කේතය ක්රියාත්මක කිරීම සඳහා, ඔබ Main.Class
ඩිරෙක්ටරිය වැනි පැකේජයේ තැබිය යුතුය ./com/test/Main.Java
. සහ මූල ඩිරෙක්ටරි භාවිතයේදී java com.test.Main
.
එකම කේතය එක් පරිගණකයක ක්රියාත්මක වන නමුත් එය තවත් පරිගණකයක දෝෂය පෙන්වන විට, මා මෙතෙක් සොයාගෙන ඇති හොඳම විසඳුම පහත පරිදි සම්පාදනය කිරීමයි:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
වැඩ කරනු ඇත! එය ඔබේ නඩුවේ වඩා හොඳ විසඳුමකි.
මට උදව් වූයේ විධාන රේඛාවේ පන්ති මාර්ගය සඳහන් කිරීමයි, උදාහරණයක් ලෙස:
නව ෆෝල්ඩරයක් සාදන්න, C:\temp
C:\temp
පහත පන්තිය සමඟ Temp.java ගොනුව සාදන්න :
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
ෆෝල්ඩරයේ විධාන රේඛාවක් විවෘත කර C:\temp
තාවකාලික පන්තිය සම්පාදනය කිරීම සඳහා පහත විධානය ලියන්න:
javac Temp.java
සම්පාදනය කරන ලද ජාවා පංතිය ධාවනය කරන්න, පංතිය -classpath
සොයා ගත හැකි ස්ථානය JRE ට දැන ගැනීමට විකල්පය එකතු කරමින් :
java -classpath C:\temp Temp Hello!
java
$ CLASSPATH (ඔබ -classpath හෝ -jar භාවිතා නිසා) හෝ 2) දෙස නැහැ මේ classpath සැකසුම බව නොව පසුබිම සකසා නැත ක්රියාත්මක ඇති මේ සන්දර්භය තුළ java
විය ධාවනය; උදා: ඔබ නිවැරදි කවචයේ setenv විධාන එකතු කළ ගොනුව "මූලාශ්ර" නොකළ නිසා.
දෝෂ පණිවිඩයට අනුව ("ප්රධාන පන්තිය සොයා ගැනීමට හෝ පූරණය කිරීමට නොහැකි විය"), ගැටළු වර්ග දෙකක් තිබේ:
ප්රධාන පන්ති කළ නොහැකි සොයා නොමැති විට පූර්ණ සුදුසුකම් ලත් පන්තියේ නාමයෙන් මුද්රණ දෝෂයක් හෝ වැරදි කාරක රීති හෝ එය සපයා classpath දී නොපවතියි .
පංතිය ආරම්භ කළ නොහැකි විට ප්රධාන පන්තිය පූරණය කළ නොහැකි විය , සාමාන්යයෙන් ප්රධාන පන්තිය වෙනත් පන්තියක් විහිදුවන අතර එම පන්තිය ලබා දී ඇති පන්ති මාවතේ නොපවතී.
උදාහරණයක් වශයෙන්:
public class YourMain extends org.apache.camel.spring.Main
ඔටුවන්-වසන්තය ඇතුළත් කර නොමැති නම්, මෙම දෝෂය වාර්තා වේ.
extends
). මම කරන ප්රධාන පන්තිය අසමත් වන විට මුහුණ දෙන ආකාරය ඉගෙන ගෙන සිටිමි බර එය කළ නොහැකි බව තවත් ව්යාප්ත නිසා සොයා , ජාවා සැබෑ පන්ති සොයාගත නොහැකි වූ වාර්තා කරන්නේ නැත (මෙන් නොව NoClassDefFoundError
). ඉතින් ඔව් එය සිදු වන අතර ඔබ මෙය නොදන්නා විට එය හිසකෙස් ඇදීමේ තත්වයකි.
උත්සාහ කරන්න -Xdiag .
ස්ටීව් සීගේ පිළිතුර මගින් සිදුවිය හැකි අවස්ථා මනාව ආවරණය කරයි, නමුත් සමහර විට පන්තිය සොයා ගැනීමට හෝ පටවා ගැනීමට නොහැකි වූයේද යන්න තීරණය කිරීම එතරම් පහසු නොවනු ඇත. භාවිතා කරන්න java -Xdiag
(JDK 7 සිට). මෙය පණිවුඩ Could not find or load main class
පණිවිඩයේ තේරුම පිළිබඳ ඉඟියක් සපයන ලස්සන ස්ටැක්ට්රේස් එකක් මුද්රණය කරයි .
නිදසුනක් ලෙස, එය සොයාගත නොහැකි වූ ප්රධාන පංතිය විසින් භාවිතා කරන වෙනත් පංති වෙත ඔබව යොමු කළ හැකි අතර ප්රධාන පන්තිය පැටවීම වලක්වනු ඇත.
මෙම නඩුවේ මට එවැනි දෝෂයක් තිබුණි:
java -cp lib.jar com.mypackage.Main
එය ;
වින්ඩෝස් සහ :
යුනික්ස් සඳහා ක්රියා කරයි :
java -cp lib.jar; com.mypackage.Main
Main
JAR ගොනුවේ නොමැති නිසාය. -cp lib.jar;
ලෙස එකම දෙයක් අදහස් -cp lib.jar;.
වත්මන් බහලුම classpath ඇතුළත් වේ එනම්.
මෙම විධානය භාවිතා කරන්න:
java -cp . [PACKAGE.]CLASSNAME
උදාහරණය: ඔබේ පන්තියේ නම Hello.java වෙතින් සාදන ලද Hello.class නම් පහත විධානය භාවිතා කරන්න:
java -cp . Hello
ඔබේ ගොනුව Hello.java පැකේජය තුළ තිබේ නම් com.demo පහත විධානය භාවිතා කරන්න
java -cp . com.demo.Hello
JDK 8 සමඟ බොහෝ විට සිදුවන්නේ පන්ති ගොනුව එකම ෆෝල්ඩරයක java
තිබීමයි , නමුත් විධානය මඟින් පංතියේ මාවත අපේක්ෂා කරන අතර මේ හේතුව නිසා අපි -cp .
වත්මන් ෆෝල්ඩරය පන්ති පථය සඳහා යොමු කිරීමක් ලෙස එකතු කරමු .
-cp .
අනවශ්යය, මන්ද එය $CLASSPATH
සකසා නොමැති නම් .
පෙරනිමි පන්ති මාර්ගය වේ.
echo %CLASSPATH%
ප්රතිදානය යනු කුමක්ද?) නැත, මට වින්ඩෝස් පරිගණකයක් නොමැති නිසා මට පරීක්ෂා කළ නොහැක.
සමහර විට ගැටලුවට හේතු විය හැකි දේ ප්රධාන පංතිය සමඟ කිසිදු සම්බන්ධයක් නැති අතර මට මෙය දුෂ්කර මාර්ගය සොයා ගැනීමට සිදු විය. එය මා යොමු කළ පුස්තකාලයක් වූ අතර එය මට ලබා දුන්නේ:
ප්රධාන පන්තියේ xxx ලිනක්ස් සොයා ගැනීමට හෝ පූරණය කිරීමට නොහැකි විය
මම එම යොමු කිරීම මකා දැමුවෙමි, එය නැවත එකතු කළෙමි, එය නැවත හොඳින් ක්රියාත්මක විය.
මෙම අවස්ථාවේදී ඔබට ඇත්තේ:
ප්රධාන පංතිය සොයා ගැනීමට හෝ පූරණය කිරීමට නොහැකි විය ?
එයට හේතුව ඔබ "-classpath" භාවිතා කරන බැවිනි, නමුත් ඉරක් java
විධාන විමසුමේදී භාවිතා කරන එකම ඉරක් නොවේ . මට මෙම ගැටළුව නොට්පෑඩ් සිට සෙ.මී.
මට එකම ගැටළුවක් ඇති අතර අවසානයේ මගේ වැරැද්ද සොයා ගත්තේය :) මම මෙම විධානය සම්පාදනය සඳහා භාවිතා කළ අතර එය නිවැරදිව ක්රියාත්මක විය:
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
නමුත් මෙම විධානය මට වැඩ කළේ නැත (මට ප්රධාන පන්තිය සොයා ගැනීමට හෝ පැටවීමට නොහැකි විය 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
අවසාන වශයෙන් මම පන්ති මාවත අවසානයේ ':' අක්ෂරය එක් කළ අතර ගැටළුව විසඳුණි:
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
මගේ නඩුවේදී, පංතියේ නම වෙනුවට ප්රභව ගොනු නාමය සපයා ඇති නිසා දෝෂයක් ඇතිවිය.
ප්රධාන ක්රමය අඩංගු පන්ති නාමය අප පරිවර්ථකයාට සැපයිය යුතුය.
ඔබේ නඩුව විශේෂයෙන් මගේ හා සමාන නම් මෙය ඔබට උදව් වනු ඇත: ආරම්භකයකු ලෙස මම ජාවා වැඩසටහනක් ක්රියාත්මක කිරීමට උත්සාහ කරන විටද මෙම ගැටලුවට මුහුණ දුන්නෙමි.
මම එය මෙසේ සම්පාදනය කළෙමි:
javac HelloWorld.java
මම එකම දිගුව සමඟ ධාවනය කිරීමට උත්සාහ කළෙමි:
java Helloworld.java
මම ඉවත් කර .java
විධානය නැවත ලිවූ විට java HelloWorld
, වැඩසටහන හොඳින් ක්රියාත්මක විය. :)
මෙහි ඇති සියලුම පිළිතුරු වින්ඩෝස් පරිශීලකයින් වෙත යොමු වී ඇති බව පෙනේ. මැක් සඳහා, පන්ති පථ බෙදුම්කරු :
නොවේ ;
. පංති මාර්ගය සැකසීමේ දෝෂයක් ;
නොමැති බැවින් වින්ඩෝස් සිට මැක් වෙත පැමිණෙන්නේ දැයි සොයා ගැනීමට අපහසු වේ.
අනුරූප මැක් විධානය මෙන්න:
java -classpath ".:./lib/*" com.test.MyClass
මෙම උදාහරණයේ පැකේජය ඇති com.test
අතර lib
ෆෝල්ඩරයක් පන්ති මාවතේ ඇතුළත් කළ යුතුය.
/*
අවශ්ය වන්නේ ඇයි ?
පන්ති ගොනු ස්ථානය: C: \ test \ com \ සමාගම
ගොනුවේ නම: Main.class
සම්පුර්ණ සුදුසුකම් ලත් පන්තියේ නම: com.company.Main
විධාන රේඛා විධානය:
java -classpath "C:\test" com.company.Main
පන්ති මාවතට \ com \ සමාගම ඇතුළත් නොවන බව මෙහිදී සටහන් කරන්න
JAR ගොනුව තැනීමට ඔබ Maven භාවිතා කරන්නේ නම් , කරුණාකර pom.xml ගොනුවේ ප්රධාන පන්තිය සඳහන් කිරීමට වග බලා ගන්න:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
මෙම ගැටළුව විසඳීම සඳහා මම සෑහෙන කාලයක් ගත කළෙමි. මම කෙසේ හෝ මගේ පන්ති මාර්ගය වැරදියට සකසා ඇති බව සිතුවද ගැටලුව වූයේ මා ටයිප් කිරීමයි:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
වෙනුවට:
java -cp C:/java/MyClasses utilities/myapp/Cool
සම්පුර්ණ සුදුසුකම් ලත් අයගේ තේරුම සම්පූර්ණ පැකේජයේ නම වෙනුවට සම්පූර්ණ මාර්ග නාමය ඇතුළත් කිරීම යැයි මම සිතුවෙමි.
utilities.myapp.Cool
එහි පැකේජයේ නම හෝ තිබේ නම් එය ලබා දිය යුතුය .
පළමුව මෙම විධානය භාවිතා කරමින් මාර්ගය සකසන්න;
set path="paste the set path address"
එවිට ඔබට වැඩසටහන පූරණය කළ යුතුය. ගබඩා කර ඇති ධාවකයේ "cd (ෆෝල්ඩරයේ නම)" ටයිප් කර එය සම්පාදනය කරන්න. උදාහරණයක් ලෙස, මගේ වැඩසටහන ඩී ඩ්රයිව් හි ගබඩා කර ඇත්නම්, "ඩී:" ටයිප් කර "සීඩී (ෆෝල්ඩරයේ නම)" ටයිප් කරන්න.
if "cd" helps then it by luck rather than by judgement
. ජාවා වත්මන් නාමාවලිය භාවිතා කරන බැවින් මෙය වැරදියි (මම විශ්වාස කරමි).
පන්තියේ මාවතේ පෙරනිමියෙන් භාවිතා කරයි.
මගේ නඩුවේ ගැටලුව විසඳූයේ:
ඔබට ක්රියාත්මක කිරීමට අවශ්ය ව්යාපෘතිය / පන්තිය මත දකුණු ක්ලික් කරන්න, ඉන්පසු Run As
-> Run Configurations
. එවිට ඔබ ඔබගේ පවතින වින්යාසය නිවැරදි කළ යුතුය, නැතහොත් පහත සඳහන් ආකාරයෙන් නව එකතු කළ යුතුය:
විවෘත කරන්න Classpath
ටැබ් එක කර Advanced...
බොත්තම ක්ලික් කර ඔබේ ව්යාපෘතියේ bin
ෆෝල්ඩරය එක් කරන්න.
වින්ඩෝස් මත .;
ආරම්භයේ දී CLASSPATH අගය යොදන්න.
එම . (dot) යන්නෙහි තේරුම "වත්මන් නාමාවලියෙහි බලන්න" යන්නයි. මෙය ස්ථිර විසඳුමකි.
එසේම ඔබට එය "එක් වරක්" කට්ටලය සමඟ සැකසිය CLASSPATH=%CLASSPATH%;.
හැකිය. ඔබේ cmd කවුළුව විවෘතව පවතින තාක් කල් මෙය පවතිනු ඇත.
ජාවා හි, ඔබ සමහර විට ජාවා ක්රියාත්මක කළ හැකි විධාන රේඛාවෙන් ජේවීඑම් ධාවනය කර පොදු ස්ථිතික අවලංගු ප්රධාන (පීඑස්වීඑම්) සහිත පන්ති ගොනුවකින් වැඩසටහනක් ආරම්භ කිරීමට උත්සාහ කරන විට, පංති පථයේ පරාමිතිය දක්වා වුවද ඔබට පහත දෝෂය ඇතිවිය හැකිය. JVM නිවැරදි වන අතර පන්ති ගොනුව පන්ති මාවතේ ඇත:
Error: main class not found or loaded
PSVM සමඟ පන්ති ගොනුව පූරණය කළ නොහැකි නම් මෙය සිදු වේ. ඒ සඳහා ඇති විය හැකි එක් හේතුවක් නම් පන්තිය අතුරු මුහුණතක් ක්රියාත්මක කිරීම හෝ පන්ති පථයේ නොමැති වෙනත් පන්තියක් දීර් ing කිරීමයි. සාමාන්යයෙන් පංතියක් පන්තියේ නොමැති නම්, විසි කළ දෝෂය පෙන්නුම් කරන්නේ එවැනි ය. එහෙත්, භාවිතයේ ඇති පන්තිය දීර් extended කර හෝ ක්රියාත්මක කරන්නේ නම්, ජාවාට පන්තියම පැටවීමට නොහැකි වේ.
යොමුව: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
මෙය විශේෂිත අවස්ථාවකි, නමුත් මම මෙම පිටුවට විසඳුමක් සොයමින් පැමිණ එය සොයා නොගත් බැවින් මම එය මෙහි එක් කරමි.
වින්ඩෝස් (7 සමඟ පරීක්ෂා කර ඇත á
) පන්තියේ සහ පැකේජ නාමවල විශේෂ අක්ෂර (වැනි ) පිළිගන්නේ නැත . ලිනක්ස් එසේ වුවද.
මම මෙය සොයාගත්තේ මම .jar
නෙට්බීන්ස් හි ඉදිකර එය විධාන රේඛාවෙන් ධාවනය කිරීමට උත්සාහ කළ අවස්ථාවේදීය. එය නෙට්බීන්ස් හි ධාවනය වූ නමුත් විධාන රේඛාවේ නොවේ.
ඔබ මෙය සැබවින්ම src
ෆෝල්ඩරයෙන් කළ යුතුය. එහිදී ඔබ පහත දැක්වෙන විධාන රේඛාව ටයිප් කරන්න:
[name of the package].[Class Name] [arguments]
ඔබගේ පංතිය කැඳවනු ඇතැයි කියමු CommandLine.class
, කේතය මේ ආකාරයෙන් පෙනේ:
package com.tutorialspoint.java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
එවිට ඔබ cd
src ෆෝල්ඩරයට යා යුතු අතර ඔබට ක්රියාත්මක කිරීමට අවශ්ය විධානය මේ ආකාරයෙන් පෙනේ:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
විධාන රේඛාවේ ප්රතිදානය වනුයේ:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
බවට src
පසුව මෙම විධානය ක්රියාත්මක java ../bin com.blah.blah.MyClass
මා වෙනුවෙන් වැඩ කරන. ඉතින් ඔත්තුවට ස්තූතියි!
වින්ඩෝස් පවර්ෂෙල් හි ප්රචාරය කර java
ඇති පරිදි -cp
විකල්පය සමඟ ධාවනය කරන විට ඔබට පෙනෙන ආකාරයට දෝෂයක් ඇතිවිය හැකිය:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
පවර්ෂෙල් විධානය පිළිගැනීමට නම්, -cp
විකල්පයේ තර්ක පහත දැක්වෙන පරිදි උපුටා දැක්වීම්වල අඩංගු විය යුතුය:
java -cp 'someDependency.jar;.' ClassName
මේ ආකාරයට විධානය සැකසීමෙන් ජාවා විසින් පන්ති මාර්ග තර්ක නිවැරදිව සැකසීමට ඉඩ දිය යුතුය.
ජාවා මොන්ගෝ ඩීබී ජේඩීබීසී සම්බන්ධතාවයක් පරික්ෂා කිරීමේදී මම ද එවැනිම දෝෂයන්ට මුහුණ දුන්නා. මගේ අවසාන විසඳුම කෙටියෙන් සාරාංශ කිරීම හොඳ යැයි මම සිතමි, එවිට අනාගතයේදී ඕනෑම කෙනෙකුට සෘජුවම විධාන දෙක පිළිබඳව සොයා බැලිය හැකි අතර තවදුරටත් ඉදිරියට යාමට හොඳ වනු ඇත.
ඔබගේ ජාවා ගොනුව සහ බාහිර පරායත්තතා (JAR ගොනු) පවතින නාමාවලියෙහි ඔබ සිටින බව උපකල්පනය කරන්න.
සම්පාදනය කරන්න:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
ධාවනය:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
පැකේජයක් නොමැති බවත්, 2) ඔබ නාමාවලිය වෙනස් නොකරන බවත්ය. එය අවම වශයෙන් කිවහොත් බිඳෙන සුළුය. ගැටළු පැහැදිලි නොකිරීමෙන්, එය ක්රියාත්මක නොවන අවස්ථාවන්හිදී මෙම ප්රවේශය අත්හදා බැලීමට නවකයන්ට මඟ පෙන්වනු ඇත . කෙටියෙන් කිවහොත්, එය "වොඩූ ක්රමලේඛන ශිල්පීය ක්රම" දිරිමත් කරයි: en.wikipedia.org/wiki/Voodoo_programming
හරි, දැනටමත් බොහෝ පිළිතුරු ඇත, නමුත් ගොනු අවසරයන් වැරදිකරු විය හැකි අවස්ථාව කිසිවෙකු සඳහන් කර නැත.
ධාවනය වන විට, පරිශීලකයෙකුට JAR ගොනුවට හෝ මාර්ගයේ එක් නාමාවලියකට ප්රවේශ විය නොහැක. උදාහරණයක් ලෙස, සලකා බලන්න:
භාජන ගොනුව /dir1/dir2/dir3/myjar.jar
JAR ගොනුව හිමි පරිශීලක 1 ට කළ හැක්කේ:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
නමුත් එය තවමත් ක්රියාත්මක නොවේ:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
මෙයට හේතුව ධාවනය වන පරිශීලකයාට (පරිශීලක 2) dir1, dir2, හෝ javalibs හෝ dir3 වෙත ප්රවේශය නොමැති වීමයි. පරිශීලක 1 ට ලිපිගොනු දැකිය හැකි විට එය යමෙකුට නීරස විය හැකි අතර ඒවාට ප්රවේශ විය හැකිය, නමුත් දෝෂය තවමත් පරිශීලක 2 සඳහා සිදු වේ.
මෙය කිරීමෙන් පසු මට මෙම දෝෂය ඇතිවිය mvn eclipse:eclipse
මෙය මගේ .classpath
ගොනුව ටිකක් අවුල් කළේය .
සිට රේඛා වෙනස් කිරීමට සිදු .classpath
විය
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
වෙත
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
මෙහි දක්වා ඇති විසඳුම් සමඟ මෙම ගැටළුව විසඳීමට මට නොහැකි විය (ප්රකාශිත පිළිතුර මගේ සංකල්ප ඉවත් කර ඇති බවට සැකයක් නැත). මම මෙම ගැටලුවට දෙවරක් මුහුණ දුන් අතර සෑම අවස්ථාවකම මම විවිධ විසඳුම් අත්හදා බැලුවෙමි (සූර්යග්රහණ IDE හි).
main
මගේ ව්යාපෘතියේ විවිධ පංතිවල විවිධ ක්රම මට හමු වී තිබේ . ඉතින්, මම මකා දැමුවාmain
පසුව ක්රම වලින් ක්රමය .main
ක්රම මකා දැමීමෙන් ගැටලුව විසඳෙන්නේ නැත. බහුවිධ පිවිසුම් ස්ථාන ඇති යෙදුමක තාක්ෂණික වශයෙන් වැරැද්දක් නොමැත.