ජාවා පන්තියේ මාර්ගය තුළ ඇති නාමාවලියක ඇති සියලුම භාජන ඇතුළත් කිරීම


1027

සියලුම බඳුන් ලිපිගොනු ඩිරෙක්ටරියක් තුළ පන්ති මාවතේ ඇතුළත් කිරීමට ක්‍රමයක් තිබේද?

මම උත්සාහ කරමි, java -classpath lib/*.jar:. my.package.Programඑම භාජන වල ඇති පන්ති ලිපිගොනු සොයා ගැනීමට එයට නොහැකි ය. සෑම භාජන ගොනුවක්ම වෙන වෙනම පන්ති පථයට එක් කිරීමට මට අවශ්‍යද?


3
කණගාටුයි මම මෙය කිසි විටෙකත් පිළිගත්තේ නැත. එය ප්‍රජා විකියක් විය යුතුය. සපයන ලද පිළිතුරු වලින් එකක්වත් භාවිතා නොකරන්න. මම විශ්වාස කරන්නේ මම ෂෙල් ස්ක්‍රිප්ටයක් නිර්මාණය කළ අතර එය ලිබ් / ඩිරෙක්ටරිය පරිලෝකනය කර ගොනු නාම විග්‍රහ කිරීමෙන් පන්ති මාර්ගය නිර්මාණය කළේය.
ක්‍රිස් සේරා

මෙම නව ජාවා විශේෂාංගයේ යම් ආකාරයක දෝෂයක් ඇත, මන්ද එය විස්තර කර ඇති පරිදි ක්‍රියා නොකරයි. එක් පිළිතුරක විස්තර කර ඇති පරිදි මම එය අතහැර දමා ඒ වටා වැඩ කිරීමට කුහුඹුවා භාවිතා කළෙමි.
ඇලෙක්ස් ආර්


1
වින්ඩෝස් හි වයිල්ඩ්කාඩ් සැකසීමේ ගැටලුවක් තිබේ. stackoverflow.com/questions/11607873/…
මයික්

7
කෙටි පිළිතුර: (1) .jarකොටස අතහරින්න , (2) අවම වශයෙන් කොටස් 2 ක් වත්; තිබිය යුතුය , එය වින්ඩෝස් මත වෙන් කර ඇත (එය සාමාන්‍යයෙන් :වෙනත් තැනක). උදාහරණයක් ලෙස:java -classpath ".;lib/*" Program
එව්ගනි සර්ජිව්

Answers:


1170

ජාවා 6 හෝ ඊට පසු, පන්ති පථ විකල්පය ආදේශක කාඩ්පත් සඳහා සහය දක්වයි. පහත සඳහන් කරුණු සැලකිල්ලට ගන්න:

  • සෘජු උපුටා දැක්වීම් භාවිතා කරන්න ( ")
  • භාවිතා කරන්න *, නැත*.jar

වින්ඩෝස්

java -cp "Test.jar;lib/*" my.package.MainClass

යුනික්ස්

java -cp "Test.jar:lib/*" my.package.MainClass

මෙය වින්ඩෝස් වලට සමාන ය, නමුත් :ඒ වෙනුවට භාවිතා කරයි ;. ඔබට ආදේශක කාඩ්පත් භාවිතා කළ නොහැකි නම්, bashපහත දැක්වෙන වාක්‍ය ඛණ්ඩයට ඉඩ දෙන්න ( libසියලුම ජාවා සංරක්ෂිත ලිපිගොනු අඩංගු නාමාවලිය කොහිද ):

java -cp "$(printf %s: lib/*.jar)"

(පංති මාර්ගයක් භාවිතා කිරීම -jarවිකල්පයට නොගැලපෙන බව සලකන්න . මෙයද බලන්න: විධාන විමසුමේ සිට බහු පන්ති පුස්තකාල සහිත භාජන ගොනුව ක්‍රියාත්මක කරන්න )

ආදේශක කාඩ්පත් අවබෝධ කර ගැනීම

පන්ති පථ ලේඛනයෙන්:

පන්ති මාර්ගය ප්රවේශ basename වයිල්ඩ්කාඩ් අඩංගු විය හැක *දීර්ඝ සමග නාමාවලියේ සියලු ගොනු ලැයිස්තුවක් නියම කිරීමට සමාන සැලකෙන, .jarහෝ .JAR. උදාහරණයක් ලෙස, පන්ති මාර්ග ප්‍රවේශය foo/*මඟින් foo නම් නාමාවලියෙහි ඇති සියලුම JAR ගොනු නියම කරයි. *වත්මන් නාමාවලියෙහි ඇති සියලුම භාජන ලිපිගොනු ලැයිස්තුවක් දක්වා විහිදෙන පංති ඇතුළත් කිරීමකි .

අඩංගු පන්ති මාර්ග ප්‍රවේශයක් *පන්ති ලිපිගොනු සමඟ නොගැලපේ. පංති සහ JAR ගොනු දෙකම එකම ඩිරෙක්ටරි foo එකකට ගැලපීමට, foo;foo/*හෝ භාවිතා කරන්න foo/*;foo. තෝරාගත් අනුපිළිවෙල මගින් fooJAR ලිපිගොනු වලට පෙර පන්ති සහ සම්පත් පටවා තිබේද යන්න තීරණය fooවේ.

උප බහලුම් පුනරාවර්තව සොයන්නේ නැත. උදාහරණයක් ලෙස, foo/*පමණක් භාජනයක් ගොනු සඳහා පෙනුම fooනොවේ දී foo/bar, foo/bazආදිය

ඩිරෙක්ටරියක ඇති JAR ලිපිගොනු පුළුල් කරන ලද පන්ති මාවතේ ගණනය කර ඇති අනුපිළිවෙල නිශ්චිතව දක්වා නොමැති අතර එය වේදිකාවේ සිට වේදිකාවට සහ එකම යන්ත්‍රයේ මොහොතේ සිට මොහොත දක්වා වෙනස් විය හැකිය. හොඳින් සාදන ලද යෙදුමක් කිසියම් විශේෂිත අනුපිළිවෙලක් මත රඳා නොපවතී. නිශ්චිත ඇණවුමක් අවශ්‍ය නම්, JAR ලිපිගොනු පැහැදිලිව පන්ති මාවතේ ගණනය කළ හැකිය.

පංති පැටවීමේ ක්‍රියාවලියේදී ප්‍රමාද නොවී, වැඩසටහනක ප්‍රධාන ක්‍රමවේදය කැඳවීමට පෙර, ආදේශක කාඩ්පත් පුළුල් කිරීම කලින් සිදු කරනු ලැබේ. ආදේශක පංතියේ සෑම අංගයක්ම ආදේශක කාඩ්පතක් අඩංගු වන අතර නම් කරන ලද නාමාවලියෙහි JAR ගොනු ගණනය කිරීමෙන් ජනනය කරන ලද (සමහර විට හිස්) මූලද්‍රව්‍ය අනුක්‍රමය මගින් ප්‍රතිස්ථාපනය වේ. උදාහරණයක් ලෙස, නාමාවලියෙහි fooඅඩංගු a.jarනම් b.jar, සහ c.jar, එවිට පන්ති මාර්ගය foo/*පුළුල් වන අතර foo/a.jar;foo/b.jar;foo/c.jar, එම දාමය පද්ධති දේපලවල වටිනාකම වේ java.class.path.

මෙම CLASSPATHපරිසර විචල්ය ඕනෑම සිට වෙනස් ප්රතිකාර නැත -classpath(හෝ -cp) විධාන රේඛාව විකල්පය. එනම්, මේ සෑම අවස්ථාවකම ආදේශක කාඩ්පත් වලට ගෞරව කරනු ලැබේ. කෙසේ වෙතත්, Class-Path jar-manifestශීර්ෂ පා in යේ පන්ති මාර්ග ආදේශක කාඩ්පත් වලට ගෞරව නොකෙරේ .

සටහන: ජාවා 8 හි දන්නා දෝෂයක් හේතුවෙන්, වින්ඩෝස් උදාහරණ පසුපස තරු ලකුණු සහිත පසුපෙළක් භාවිතා කළ යුතුය: https://bugs.openjdk.java.net/browse/JDK-8131329


2
විශේෂාංගය දුර්වල ලෙස ලේඛනගත කර ඇති අතර, අපේක්ෂිත පරිදි වැඩ කිරීම සඳහා පැහැදිලි පූර්ව කොන්දේසි වලට වඩා සෑහීමකට පත්විය යුතු බව පෙනේ.
ඇලෙක්ස් ආර්

1
අන්තිම bash / tr උපක්‍රමය සඳහා +1. මෙහි ඇති ජාවා / ජෑම්වීඑම් වැඩ කරන නාමාවලියෙන් පිටත මාර්ග සඳහා වන කාඩ්පත් වලට කැමති නැත, නමුත් ෂෙල් වයිල්ඩ්කාඩ් + trවැඩ භාවිතා කරමින් සෑම JAR එකක්ම පැහැදිලිව සඳහන් කරයි!
සුපර්

1
මට java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassකිසිදු උපුටා දැක්වීමකින් තොරව විධානයක් ඇති අතර එය හොඳින් ක්‍රියාත්මක වේ. මම කල්පනා කරන්නේ කවචය එය පුළුල් නොකරන්නේ ඇයි?
yellavon

3
~-Cp
Sohail Si

1
ඔබේ වින්ඩෝස් උදාහරණය ජාවා 8 හෝ ඊට පෙර ක්‍රියා නොකරයි, නමුත් මෙම පංති මාර්ගය සමඟ මෙය සිදු වේ: ටෙස්ට්.ජාර්; ලිබ් \ * ... තරු ලකුණු කිරීමට පෙර සහ තවත් කිහිප දෙනෙකුට හැර ඉදිරි කප්පාදුව හරි ය ... bugs.openjdk
philwalk

227

කවුළු යටතේ මෙය ක්‍රියාත්මක වේ:

java -cp "Test.jar;lib/*" my.package.MainClass

මෙය ක්‍රියාත්මක නොවේ:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

* .ජාර් බලන්න, එබැවින් * ආදේශක කාඩ්පත තනිවම භාවිතා කළ යුතුය .


ලිනක්ස් හි, පහත සඳහන් ක්‍රියා කරයි:

java -cp "Test.jar:lib/*" my.package.MainClass

බෙදුම්කරුවන් අර්ධ සළකුණු වෙනුවට කොලොන් වේ.


17
නියම පිළිතුර. සැලකිල්ලට ගත යුතු වැදගත් කරුණු 2 ක්: 1) උපුටා දැක්වීම් භාවිතා කරන්න සහ 2) * පමණක් නොව * භාවිතා කරන්න
.ජාර්

4
වසරක් සහ මාස 8 කට පසුව, යුනික්ස් අනුවාදය ඇතුළත් කිරීමට මා කළ සංස්කරණය නැවත මා බේරා ගත්තේය. :) නොසිතා එය මාගේ භාජනයක් ගොනු පිළිනොගන්නා බවත් *.jarනමුත් පමණක් *.
jmort253

පන්ති මාර්ගවල අනුපිළිවෙල වැදගත් බව මට පෙනී ගියේය (නමුත් එයට හේතුව මම නොදනිමි). මම පන්ති මාර්ග අනුපිළිවෙල මාරු කරන තුරු මට දෝෂ ඇති විය.
user13107

@ jmort253, කාරණය නම්, මෙය ෂෙල් * ප්‍රසාරණය නොවේ, නමුත් ආදේශක කාඩ්පත ජාවා පන්තියේ මාවත විග්‍රහ කරමින්, * දැකීම සහ ආදේශක කාඩ්පත පුරවා ගැනීම
සෙබස්තියන්

1
E සෙබස්තියන් ගොඩ්ලෙට් - ඔව්, මම රෙජෙක්ස් වයිල්ඩ් කාඩ් සහ මෙම අංකනය අතර ව්‍යාකූලත්වයට පත්වෙනවා, එය මම අනුමාන කරන ආකාරයටම නොවේ. බොහෝ දුරට, මාව බේරාගත්තේ :එක් වේදිකාවක සහ අනෙක් වේදිකාවේ වෙනස දැන ගැනීමයි ;. :) මම වසරකට එක් වරක් විධාන රේඛාවේ සිට ජාවා සමඟ සම්පාදනය කරමි, කොපමණ වාර ගණනක් කරදරකාරීද යන්න මතක තබා ගැනීමට ප්‍රමාණවත් නොවේ.
jmort253

67

අපට අවශ්‍ය අනෙකුත් භාජන සමඟ පන්ති මාර්ගයක් සඳහන් කරන මැනිෆෙස්ට් ( ) ගොනුවක් අඩංගු ප්‍රධාන භාජන ගොනුවක් යෙදවීමෙන් අපි මෙම ගැටළුව මඟහරවා ගනිමු. මෙම අවස්ථාවේදී, ඔබට ප්‍රකාශ කිරීමට අවශ්‍ය වන්නේ කේතය ක්‍රියාත්මක කිරීමේදී පමණි .myapp.jarManifest.mfjava -jar myapp.jar

එබැවින් ඔබ ප්‍රධාන jarඩිරෙක්ටරියක් තුළට යොදවා යැපෙන භාජන ඊට libයටින් ඇති ෆෝල්ඩරයකට දැමුවහොත්, මැනිෆෙස්ට් එක පෙනෙන්නේ:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

සැ.යු: මෙය වේදිකා-ස්වාධීන ය - යුනික්ස් සේවාදායකයක් හෝ වින්ඩෝස් පරිගණකයක් මත දියත් කිරීමට අපට එකම භාජන භාවිතා කළ හැකිය.


මෙය බොහෝ දෙනෙකුට වැඩ කරන බව පෙනේ, කෙසේ වෙතත්, ජාවා මෙහි ඇති මැනිෆෙස්ට් ගොනුවේ පන්ති-මාර්ග ඇතුළත් කිරීම් පැහැදිලිවම නොසලකා හරින බවක් පෙනේ. -Cp භාවිතා කරමින් පන්ති පථයට "lib / *" අතින් එකතු නොකර අපට යෙදුම ක්‍රියාත්මක කළ නොහැක. අදහස් තිබේද?
රකු

6
oxbow_lakes ගේ පිළිතුර සම්පූර්ණයෙන්ම නිවැරදි නැත; ඔබ මෙම භාජනය java -jar myapp.jar සමඟ ආරම්භ කරන්නේ නම් පංති-මාර්ගය ගෞරවයට පාත්‍ර වේ (සහ එය ගෞරවයට පාත්‍ර වේ; -cp / -classpath නොසලකා හරිනු ලැබේ!). මම හිතන්නේ ඔක්ස්බෝ_ලේක්ස් ලිවීමට අදහස් කළේ ඔහු 'java -classpath myapp.jar' ලියන විටය.
rzwitserloot

48

"ලිබ්" නාමාවලියෙහි සියලුම භාජන ඇති ජාවා-සන් 1.6.0_24 භාවිතා කරමින් උබුන්ටු 10.04 හි මගේ විසඳුම:

java -cp.: lib / * my.main.Class

මෙය අසමත් වුවහොත්, පහත දැක්වෙන විධානය ක්‍රියාත්මක විය යුතුය.

java -cp $ (i සඳහා lib / *. jar; do echo -n $ i :; done). my.main.Class

4
විහිලු සටහනක්. java -cp lib / * my.main.Class සෑම විටම අසාර්ථක වන්නේ ෂෙල් ග්ලෝබ් lib / * පුළුල් වන අතර java -cp.: lib / * my.main.Class එසේ නොවන නිසා: lib / * වලංගු ග්ලෝබ් නොවේ මාර්ගය. එය සටහන් කර ගැනීමට ටික වේලාවක් ගත කරන්න
ඇල්බන්

1
මෙය ක්‍රියා නොකරයි; ලිනක්ස් පුළුල් කරයි . ඔබට උත්සාහ කළ හැකිය: java -cp '.: lib / ' එය හොඳින් ක්‍රියාත්මක වේ (තනි උපුටා දැක්වීම් සටහන් කරන්න! එය ද්විත්ව උපුටා දැක්වීම් සමඟ ක්‍රියා නොකරනු ඇත!). ඇත්ත වශයෙන්ම,.: Lib / * එය මහා බඩවැල හේතුවෙන් නීත්‍යානුකූල ග්ලෝබ් එකක් නොවේ නම් ක්‍රියා කළ හැකි නමුත් එය ටිකක් iffy ලෙස දැනේ. මම උපුටා දැක්වීම් එකතු කරන්නම්. තනි උපුටා දැක්වීම් මඟින් අන්තර්ගතයේ කිසිදු කොටසක් ස්පර්ශ නොකරන ලෙස බාෂ්ට පවසයි.
rzwitserloot

ඔබ තනි හෝ ද්විත්ව උපුටා දැක්වීම් භාවිතා කරන්නේ නම් (මෙම සන්දර්භය තුළ) එය වැදගත් නොවේ. ඔබට අවශ්‍ය වන්නේ කවචය * (ග්ලෝබින්) ප්‍රසාරණය වීම වැළැක්වීමට ය, එපමණයි. "ලිබ් / *" පා text ය වචනාර්ථයෙන් ජේවීඑම් වෙත යොමු කරන්න, එබැවින් වීඑම් මෙය "විශේෂ රටාවක්" ලෙස හඳුනාගෙන භාජන ගොනු සඳහා තනිවම සොයයි.
ඒන්ජල් ඕස්පියර්

39

කෙටි පිළිතුර: java -classpath lib/*:. my.package.Program

ඔරකල් classpaths දී ආදේශක භාවිතා මත ප්රලේඛනය සපයයි මෙතන ජාවා 6 ක් සහ මෙහි ජාවා 7 සඳහා , ගමන් මේ වගන්තිය යටතේ අවබෝධතා පන්ති මාර්ගය මෙය ආදේශක . (මා මෙය ලියන විට, පිටු දෙකෙහි එකම තොරතුරු අඩංගු වේ.) මෙන්න විශේෂ අවස්ථා වල සාරාංශයක්:

  • පොදුවේ ගත් කල, ලබා දී ඇති නාමාවලියකට සියලුම JAR ඇතුළත් කිරීමට, ඔබට ආදේශක කාඩ්පත භාවිතා කළ හැකිය *( නැත *.jar ).

  • ආදේශක කාඩ්පත ගැලපෙන්නේ JAR වලට මිස පන්ති ලිපිගොනු වලට නොවේ; සියලුම පන්ති ඩිරෙක්ටරියක් තුළට ලබා ගැනීම සඳහා, ඩිරෙක්ටරි නාමයෙන් පන්ති පථ ප්‍රවේශය අවසන් කරන්න.

  • සියලුම JAR සහ පන්ති ලිපිගොනු නාමාවලියකට ඇතුළත් කිරීම සඳහා ඉහත විකල්ප දෙක ඒකාබද්ධ කළ හැකි අතර සුපුරුදු පන්ති පථයේ ප්‍රමුඛතා නීති අදාළ වේ. උදා-cp /classes;/jars/*

  • ආදේශක කාඩ්පත උප බහලුම් වල JAR සොයන්නේ නැත .

  • ඔබ CLASSPATHපද්ධති දේපල -cpහෝ -classpathවිධාන රේඛා කොඩි භාවිතා කරන්නේ නම් ඉහත වෙඩි උණ්ඩ සත්‍ය වේ. කෙසේ වෙතත්, ඔබ Class-PathJAR මැනිෆෙස්ට් ශීර්ෂය භාවිතා කරන්නේ නම් (ඔබ කුහුඹුවන් තැනීමේ ගොනුවක් සමඟ කළ හැකි පරිදි), ආදේශක කාඩ්පත් වලට ගෞරව නොකෙරේ .

ඔව්, මගේ පළමු සබැඳිය ඉහළම ලකුණු ලබා දුන් පිළිතුරෙන් ලබා දී ඇති ආකාරයටමයි (ඒවා අභිබවා යාමට මට බලාපොරොත්තුවක් නැත), නමුත් එම පිළිතුර සබැඳියෙන් ඔබ්බට වැඩි පැහැදිලි කිරීමක් සපයන්නේ නැත. මේ දිනවල ස්ටැක් පිටාර ගැලීම මත එවැනි හැසිරීම අධෛර්යමත් වී ඇති බැවින් , මම එය පුළුල් කරාවි යැයි සිතුවෙමි.


මගේ ගැටලුව වූයේ lib / * වෙනුවට ලිබ් / *. ගොඩක් ස්තූතියි මේක හදලා. අතර වෙනසක් ඇති බව මම දුටුවෙමි: සහ; නමුත් එය මගේ පරීක්ෂණ-බොහෝ වෙනස්වීම්-එකම වේලාවක සිදු විය හැකිය.
ඊයාඩ් ඊබ්‍රාහිම්


"." සඳහා අමතර පන්ති මාර්ග ප්‍රවේශය ඇත්තේ මන්දැයි මට විශ්වාස නැත. මගේ ගැටලුව විසඳුවා, නමුත් එය දැන් ක්‍රියාත්මක වේ. "." මම ආදේශක කාඩ්පත සමඟ සඳහන් කළ නාමාවලියම වේ. මෙය වැදගත් වන්නේ මන්දැයි මට නොපෙනේ, නමුත් එය එසේ විය. ස්තූතියි!
ඩේට්බේට්ස්

38

වින්ඩෝස් :

 java -cp file.jar;dir/* my.app.ClassName

ලිනක්ස් :

 java -cp file.jar:dir/* my.app.ClassName

මතක් කරන්න:
- වින්ඩෝස් පථ බෙදුම්කරු යනු ;
- ලිනක්ස් පථ බෙදුම්කරු :
- වින්ඩෝස් හි සීපී තර්කයේ සුදු අවකාශයක් නොමැති නම්, “උපුටා දැක්වීම්” අත්‍යවශ්‍ය නොවේ


වින්ඩෝස් උදාහරණය ජාවා 8 සහ ඊට පෙර ක්‍රියා නොකරයි: bugs.openjdk.java.net/browse/JDK-8131329
philwalk

සමහර විට විවෘත ජේඩීකේ සඳහා වැඩ නොකරනු ඇත, මම මෙය පරීක්ෂා කර මෙහි කතා කරමි
වෙන්ඩර්

කණගාටුයි, මම හොට්ස්පොට් සමඟ පරීක්‍ෂණයක් කළ අතර එය openjdk සමඟ ක්‍රියා කරන බව මම සිතුවෙමි.
වෙන්ඩර්

කවුළු යටතේ ඇති ඔරකල් ජාවා ඉදිරි කප්පාදුවකට වඩා තරු ලකුණට පෙර බැක්ස්ලෑෂ් අවශ්‍ය වේ, නමුත් මම නවතම හෝ විකල්ප ජාවා අනුවාදයන් නැවත පරීක්ෂා කර නැත.
philwalk

34

මට නම් මෙය ජනේල වලින් ක්‍රියා කරයි.

java -cp "/lib/*;" sample

ලිනක්ස් සඳහා

java -cp "/lib/*:" sample

මම ජාවා 6 භාවිතා කරමි


කවුළු උදාහරණයක් ජාවා 6 ක් වැඩ කර ගැනීමට, සමහරවිට ජාවා 7, නමුත් ජාවා 8 (බලන්න පෙනේ bugs.openjdk.java.net/browse/JDK-8131329 )
philwalk

ලිනක්ස් හි ජාවා 8 සඳහා වැඩ කරයි
ජොනතන් ඩ්‍රැපියෝ

29

ඔබට ජාවා උත්සාහ කළ හැකිය -Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

ජාවා ධාවනය කිරීමේදී බාහිර භාජන සඳහා නාමාවලිය


3
මෙය ක්‍රියාත්මක වන නමුත් -Djava.ext.dirs=පරෙස්සම් වන්න, පෙර-jar
ජියෝවානි ෆන්චල්

5
java.ext.dirs පන්තියේ සාමාන්‍ය බඳුනකට වඩා බෙහෙවින් වෙනස් වනු ඇත. එයට ඉහළ ප්‍රමුඛතාවයක් සහ අවසරයක් ඇති අතර එමඟින් බූට්ස්ටැම්ප් (rt.jar) හි පන්ති කෙසේ හෝ අභිබවා යා හැකිය
ඩෙනිස් සී

ස්තූතියි. 'ජාවා අනුවාදය "1.8.0_221" ජාවා (ටීඑම්) එස්ඊ ධාවන කාල පරිසරය (1.8.0_221-b27 සාදන්න) ජාවා හොට්ස්පොට් (ටීඑම්) 64-බිට් සර්වර් වීඑම් (25.221-බී 27, මිශ්‍ර ප්‍රකාරය සාදන්න)', මෙම -D අනුවාදය පමණි පංතියේ ගමන් කිරීම වැඩ කළා. සාම්ප්‍රදායික ස්වරූපය එසේ නොවීය.
මැට් කැම්බල්

24

නිවැරදි :

java -classpath "lib/*:." my.package.Program

වැරදියි:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

java -classpath "lib / * :." my.package.Program මා වෙනුවෙන් වැඩ කර ඇත
මුගීෂ් හුසේන්

9

ඔබට සියලු .jar ගොනු ගතිකව නියම කිරීමට අවශ්‍ය නම් ඔබට ෂෙල් ස්ක්‍රිප්ට් හෝ අපාචේ ඇන්ට් භාවිතා කළ හැකිය . කොමන්ස් ලොන්චර් නමින් කොමන්ස් ව්‍යාපෘතියක් ඇත, එය මූලික වශයෙන් ඔබේ ආරම්භක ස්ක්‍රිප්ට් කුහුඹුවන් තැනීමේ ගොනුවක් ලෙස සඳහන් කිරීමට ඉඩ දෙයි (මා අදහස් කරන්නේ කුමක්දැයි ඔබ දුටුවහොත්).

එවිට, ඔබට මෙවැනි දෙයක් නියම කළ හැකිය:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

ඔබගේ දියත් කිරීමේ ගොනුවේ, නිවැරදි පන්තියේ මාවත සමඟ ඔබේ යෙදුම දියත් කරනු ඇත.


9

ඔබ ජාවා 6 භාවිතා කරන්නේ නම්, ඔබට පන්ති මාවතේ ආදේශක කාඩ්පත් භාවිතා කළ හැකිය.

දැන් පන්ති මාර්ග අර්ථ දැක්වීමේදී ආදේශක කාඩ්පත් භාවිතා කළ හැකිය:

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes

Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/


8

වින්ඩෝස් හි ජාවා 7 සඳහා ආදේශක කාඩ්පත් පුළුල් කිරීම කැඩී ඇති බව කරුණාවෙන් සලකන්න.

පරීක්ෂා කරන්න මෙම StackOverflow ප්රශ්නය වැඩි විස්තර සඳහා.

මෙහි ප්‍රති ar ලය වනුයේ ආදේශක කාඩ්පතට පසුව අර්ධ සළකුණක් දැමීමයි. java -cp "somewhere/*;"


6

එයින් දක්වන්නේ කා ගැනද,

MSYS / MinGW කවචයක් යටතේ වින්ඩෝස් හි මෙම අමුතු හැසිරීම මට හමු විය.

කටයුතු:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

වැඩ කරන්නේ නැත:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

ආදේශක කාඩ්පත කවචයෙන් පුළුල් නොවන බව මට හොඳටම විශ්වාසයි, මන්ද උදා

$ echo './*'
./*

( echoඑකම ප්‍රති result ලය සහිතව ගොඩනඟන ලද ඒවාට වඩා වෙනත් වැඩසටහනකින් එය උත්සාහ කර බලන්න .)

එය javacපුළුල් කිරීමට උත්සාහ කරන බව මම විශ්වාස කරමි , එය තර්කයේ අර්ධ සළකුණක් තිබේද නැද්ද යන්න වෙනස් ලෙස හැසිරේ. පළමුව, එය මාර්ග ලෙස පෙනෙන සියලු තර්ක පුළුල් කිරීමට උත්සාහ කරයි. -cpපහත දැක්වෙන ටෝකනය පමණක් ගෙන එය විග්‍රහ කරනු ඇත . ( com.comsol.aco_1.0.0.jarඑම නාමාවලියෙහි දෙවන JAR එය බව සලකන්න .) එපමණකි.

මෙය

$ javac -version
javac 1.7.0

5

ඔබ සූර්යග්‍රහණය හෝ නෙට්බීන්ස් වැනි ඕනෑම IDE එකකින් පිටත ජාවා යෙදුම සංවර්ධනය කර ක්‍රියාත්මක කරන්නේ නම් ඉහත සඳහන් සියලු විසඳුම් විශිෂ්ට ලෙස ක්‍රියාත්මක වේ.

ඔබ වින්ඩෝස් 7 හි සිටින අතර ජාවා හි සංවර්ධනය සඳහා එක්ලිප්ස් අයිඩීඊ භාවිතා කරන්නේ නම්, සූර්යග්‍රහණය තුළ සාදන ලද පන්ති ලිපිගොනු ධාවනය කිරීමට විධාන විමසුමක් භාවිතා කරන්නේ නම් ඔබට ගැටළු ඇතිවිය හැකිය.

උදා: සූර්යග්‍රහණයේ ඇති ඔබේ ප්‍රභව කේතයට පහත දැක්වෙන පැකේජ ධූරාවලිය ඇත: edu.sjsu.myapp.Main.java

Main.java සඳහා බාහිර පරායත්තතාවයක් ලෙස ඔබට json.jar ඇත

ඔබ සූර්යග්‍රහණය තුළ සිට Main.java ධාවනය කිරීමට උත්සාහ කරන විට, එය කිසිදු ගැටළුවක් නොමැතිව ක්‍රියාත්මක වේ.

නමුත් ඔබ මෙය සූර්යග්‍රහණයෙන් Main.java සම්පාදනය කිරීමෙන් පසු විධාන විමසුමක් භාවිතයෙන් ධාවනය කිරීමට උත්සාහ කරන විට, එය "ClassNotDef Error blah blah" යැයි කියමින් අමුතු දෝෂ කිහිපයක් විදහා දක්වනු ඇත.

මම හිතන්නේ ඔබ ඔබේ ප්‍රභව කේතයේ වැඩ කරන නාමාවලියෙහි සිටින බව !!

විධාන විමසුමෙන් එය ක්‍රියාත්මක කිරීමට පහත සින්ටැක්ස් භාවිතා කරන්න:

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [අතපසු කරන්න එපා. ඉහත]

මෙයට හේතුව ඔබ Main.java edu.sjsu.myapp පැකේජය තුළ තබා ඇති අතර java.exe නිශ්චිත රටාව සොයා බලනු ඇත.

එය උපකාරී වේ යැයි සිතමි !!


4

කවුළු සඳහා මිල ගණන් අවශ්‍ය වේ; බෙදුම්කරු ලෙස භාවිතා කළ යුතුය. උදා:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

කෙටි පෝරමය: ඔබේ ප්‍රධාන භාජනය තුළ තිබේ නම්, එය ක්‍රියාත්මක කිරීම සඳහා පැහැදිලිව ප්‍රකාශිත අතිරේක '-ජාර් මාවතක් / ඔබේ ජාර් / ඔබේ ජාර්ස්නාම්.ජාර්' ඔබට අවශ්‍ය වනු ඇත ('YourJarsName.jar' පන්ති මාවතේ තිබුණද) (හෝ , මීට වසර 5 කට පෙර ඇසූ මුල් ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා ප්‍රකාශ කරන ලදි: ඔබට එක් එක් භාජනය පැහැදිලිව නැවත ප්‍රකාශ කිරීමට අවශ්‍ය නැත, නමුත් java6 සමඟ වුවද ඔබේ බඳුන නැවත ප්‍රකාශ කිරීමට අවශ්‍ය බව පෙනේ ...)


දිගු පෝරමය: (ජාවා වෙත අන්තර් සම්බන්ධකයන්ට පවා මෙය භාවිතා කළ හැකි යැයි මම විශ්වාස කරමි.

මෙහි සිටින බොහෝ අය මෙන් මම භාජන අපනයනය කිරීමට සූර්යග්‍රහණය භාවිතා කරමි: (ගොනුව-> අපනයනය -> 'ධාවනය කළ හැකි JAR ගොනුව'). 'පුස්තකාල හැසිරවීම' සූර්යග්‍රහණය (ජූනෝ) පිරිනැමීම් සඳහා විකල්ප තුනක් තිබේ:

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

සාමාන්‍යයෙන් මම opt2 භාවිතා කරමි (සහ opt1 අනිවාර්යයෙන්ම කැඩී යයි), කෙසේ වෙතත් මම භාවිතා කරන එක් භාජනයක ස්වදේශීය කේතය, ඔබ එම විකල්පය තෝරාගැනීමේදී සූර්යග්‍රහණය උත්තේජනය කරන හුරුබුහුටි “ජරින්ජාර්” උපක්‍රමයෙන් බිඳීම් සොයා ගතිමි. මට opt3 අවශ්‍ය බව වටහා ගැනීමෙන් පසුවත්, මෙම StackOverflow ප්‍රවේශය සොයාගැනීමෙන් පසුවත්, මගේ ප්‍රධාන සූර්යග්‍රහණයෙන් පිටත දියත් කරන්නේ කෙසේදැයි සොයා ගැනීමට මට තව කාලයක් ගත විය, එබැවින් මෙන්න මට වැඩ කළ දේ, එය අනෙක් අයට ප්‍රයෝජනවත් බැවින් ...


ඔබ ඔබේ භාජනය නම් කළේ නම්: "fooBarTheJarFile.jar" සහ සියල්ල dir වෙත අපනයනය කිරීමට සකසා ඇත: "/ theFully / qualPath / toYourChosenDir".

(එහි අර්ථය 'අපනයන ගමනාන්තය' ක්ෂේත්‍රය කියවනු ඇත: '/ TheFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

ඔබ අවසන් වූ පසු, ඔබ සූර්යග්‍රහණය සොයාගනු ඇති අතර පසුව සියලුම පුස්තකාල එම අපනයන නාමාවලිය තුළ ඇති 'fooBarTheJarFile_lib' නම් ෆෝල්ඩරයකට දමනු ඇත.

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

එවිට ඔබට ඔබේ පද්ධතියේ ඕනෑම තැනක සිට දියත් කළ හැකිය:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(ජාවා නිව්බීස් සඳහා: 'පැකේජය. Java 'ඔබ ජාවා පිටත සිට ධාවනය කිරීමට කැමති බව)


අවධානයට ලක්විය යුතු අවාසිය නම්, ඔබ ප්‍රකාශිත පන්ති මාවතේ ඇති භාජන ලැයිස්තුව තුළ 'fooBarTheJarFile.jar' තිබීම ප්‍රමාණවත් නොවන බවයි. ඔබ පැහැදිලිවම '-ජාර්' ප්‍රකාශ කළ යුතු අතර, එම භාජනයේ පිහිටීම නැවත ප්‍රකාශ කරන්න.

උදා: මෙය කැඩී යයි:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

සාපේක්ෂ මාර්ග සමඟ නැවත ආරම්භ කරන ලදි:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(ජාවා අනුවාදය "1.6.0_27" භාවිතා කිරීම; උබුන්ටු 12.04 හි OpenJDK 64-Bit Server VM හරහා)


4

macOS, වත්මන් ෆෝල්ඩරය

මැකෝස් මොජාවේ ජාවා 13 සඳහා …

ඔබගේ සියලුම .jarලිපිගොනු එකම ෆෝල්ඩරයේ cdතිබේ නම්, එය ඔබගේ වර්තමාන වැඩ කරන නාමාවලිය බවට පත් කිරීමට භාවිතා කරන්න . සමඟ සත්‍යාපනය කරන්න pwd.

සඳහා -classpathඔබ මුලින්ම ලැයිස්තුගත කළ යුතුයි භාජනයක් ගොනුව ඔබගේ යෙදුම සඳහා. මහා පරිමාණයේ අක්ෂර :පරිසීමකයක් ලෙස භාවිතා කරමින් , *අනෙක් සියලුම JAR ගොනු එකම ෆෝල්ඩරයක් තුළ ලබා ගැනීමට තරු ලකුණු කරන්න. අවසාන වශයෙන්, ඔබේ mainක්‍රමය සමඟ පන්තියේ සම්පූර්ණ පැකේජ නාමය ලබා දෙන්න .

උදාහරණයක් ලෙස, JAR ගොනුවක යෙදුමක් සඳහා නම් කරන ලද පැකේජයක නම් කරන ලද පන්තියක ක්‍රමයක් my_app.jarසමඟ නම් කර ඇති අතර එකම ෆෝල්ඩරයේ අවශ්‍ය භාජන කිහිපයක් සමඟ:mainAppcom.example

java -classpath my_app.jar:* com.example.App

3

තනි තනිව එය කරන්නේ කෙසේදැයි මා දන්නා එකම ක්‍රමය, උදාහරණයක් ලෙස:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

උපකාරවත් වන බලාපොරොත්තුව!


'08 හි ඇති එකම මාර්ගය මෙය විය හැකි නමුත් තවදුරටත් නොවේ.
simo.3792

මෙය නරකම දෙය නොවේ. එය කඩුල්ලක්, නමුත් මෙම කට්ටලය මගේ bashrc හි ඇතfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
ඩෙවොන් පෙටිකොලාස්

3

wepapp වෙතින් පන්තිය:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

ඔබ ඒවා වෙන වෙනම එකතු කළ යුතුය. විකල්පයක් ලෙස, ඔබට ඇත්ත වශයෙන්ම නාමාවලියක් නියම කිරීමට අවශ්‍ය නම් , ඔබට සෑම දෙයක්ම එක දිශාවකට අක්‍රිය කර එය ඔබේ පන්ති මාර්ගයට එක් කළ හැකිය. කෙසේ වෙතත්, ඔබ පංති මාර්ග සංස්කරණයේ සහ පාලනය කළ නොහැකි වීමේ විකාර ගැටලු ඇති බැවින් මම මෙම ප්‍රවේශය නිර්දේශ නොකරමි.


3
'08 හි ඇති එකම මාර්ගය මෙය විය හැකි නමුත් තවදුරටත් නොවේ.
simo.3792

2

/ * සිට -cp සැකසීමට හැකිවීම සඳහා solution ජු විසඳුමක් නොවේ, නමුත් ගතික පන්ති මාර්ග සහ ලිබ් ඩිරෙක්ටරි සඳහා තත්වය ටිකක් ලිහිල් කිරීමට ඔබට පහත ස්ක්‍රිප්ට් භාවිතා කළ හැකි යැයි මම විශ්වාස කරමි.

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

ලිනක්ස් සඳහා තිර රචනය කර ඇති අතර, කවුළු සඳහා ද ඒ හා සමාන එකක් තිබිය හැකිය. “LibDir2Scan4jars” වෙත ආදාන ලෙස නිසි නාමාවලිය සපයා තිබේ නම්; ස්ක්‍රිප්ට් මඟින් සියලු භාජන පරිලෝකනය කර පන්ති පථයක් නිර්මාණය කර එය "tmpCLASSPATH" යන විචල්‍යයට අපනයනය කරනු ඇත.


1

බහලුම් ගොනුවක් නාමාවලි ව්‍යුහයක මුල ලෙස සිතන්න. ඔව්, ඔබ ඒවා වෙන වෙනම එකතු කළ යුතුයි.


1

පංති පථය සුදුසු බඳුන් සහ වත්මන් නාමාවලියෙහි පන්ති ලිපිගොනු සකස් කරන්න.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

මට ෆෝල්ඩරයක බඳුන් කිහිපයක් තිබේ. පහත විධානය මා වෙනුවෙන් වැඩ කළේයJDK1.8ෆෝල්ඩරයේ ඇති සියලුම භාජන ඇතුළත් කිරීමට . ඔබට පන්ති මාවතේ ඉඩක් ඇත්නම් මිල ගණන් වලට ඇතුළත් කිරීමට කරුණාවෙන් සලකන්න

වින්ඩෝස්

සම්පාදනය: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

ධාවනය: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

ලිනක්ස්

සම්පාදනය: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

ධාවනය: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

මම ජාවා ගොනුව භාජනයක් ලෙස හෝ උබුන්ටු හි පන්ති ලෙස ධාවනය කිරීමට උත්සාහ කරමි. මම විකල්ප දෙකෙන්ම අසමත් විය. පහත දැක්වෙන ව්යතිරේකය වන්නේ එහි ප්රතිදානයයි.

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

හෝ

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

හෝ

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

මම පිළිතුර සොයාගත්තා:

මගේ මෝඩකම.

පළමු පියවර: ඔබ අනුරූප ජාවා සැකසිය යුතුය: මට ජාවා 11 තිබුනද මම 8 වන අනුවාදය ජාවා ලිබ් මාර්ගය ලෙස සකසා ඇත! - ඔබට මෙතැන් සිට ජාවා අනුවාදය සැකසිය හැකිය:

  sudo update-alternatives --config java

දෙවන පියවර: ඉන්පසු ඔබේ අනුරූප මාර්ගයට සහ ලිපිගොනු වලට මාර්ගය සහ ගොනු නම් වෙනස් කිරීමෙන් පහත විධානය ක්‍රියාත්මක කරන්න:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

එය සාර්ථකව ක්‍රියාත්මක විය!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.