জাভা ক্লাসপাথের মধ্যে একটি ডিরেক্টরিতে সমস্ত জার অন্তর্ভুক্ত


1018

ক্লাসপথে কোনও জার ফাইলগুলি কোনও ডিরেক্টরিতে অন্তর্ভুক্ত করার উপায় আছে কি?

আমি চেষ্টা করছি java -classpath lib/*.jar:. my.package.Programএবং এটি অবশ্যই সেই জারগুলিতে থাকা ক্লাসের ফাইলগুলি সন্ধান করতে সক্ষম নয়। আমার কি প্রতিটি জার ফাইল আলাদাভাবে ক্লাসপথে যুক্ত করার দরকার আছে?


3
দুঃখিত আমি এটি কখনও গ্রহণ করি নি। এটি একটি সম্প্রদায়ের উইকি হওয়া উচিত। সরবরাহিত উত্তরগুলির মধ্যে কখনও ব্যবহার করেন নি। আমি বিশ্বাস করি যে আমি একটি শেল স্ক্রিপ্ট তৈরি করেছি যা কেবলমাত্র lib / ডিরেক্টরিটি স্ক্যান করে ফাইলের নাম পার্সিং থেকে ক্লাসপথ তৈরি করে।
ক্রিস সেররা

এই নতুন জাভা বৈশিষ্ট্যে একটি ধরণের বাগ রয়েছে, কারণ এটি বর্ণিত হিসাবে কাজ করে না। আমি ছেড়ে দিয়েছি এবং পিঁপড়াটিকে তার চারপাশে কাজ করতে ব্যবহার করেছি, যেমন উত্তরের একটিতে বর্ণিত হয়েছে।
অ্যালেক্স আর


1
উইন্ডোজে ওয়াইল্ডকার্ড প্রক্রিয়াকরণ নিয়ে সমস্যা রয়েছে। stackoverflow.com/questions/11607873/...
Mykhaylo Adamovych

6
সংক্ষিপ্ত উত্তর: (1) .jarঅংশটি ফেলে দিন , (2) কমপক্ষে 2 টি অংশ থাকতে হবে,; যা উইন্ডোজ দ্বারা (যা সাধারণত :অন্য কোথাও থাকে) দ্বারা আলাদা হয় । উদাহরণস্বরূপ:java -classpath ".;lib/*" Program
এভেজেনি সার্জিভ

উত্তর:


1159

জাভা 6 বা তার পরে ব্যবহার করে, ক্লাসপথ বিকল্পটি ওয়াইল্ডকার্ডগুলিকে সমর্থন করে। নিম্নলিখিত নোট:

  • সোজা উদ্ধৃতি ব্যবহার করুন ( ")
  • ব্যবহার *, না*.jar

উইন্ডোজ

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

ইউনিক্স

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

এই উইন্ডোজ অনুরূপ, কিন্তু ব্যবহার :পরিবর্তে ;। যদি আপনি ওয়াইল্ডকার্ড ব্যবহার করতে না পারেন bashতবে নিম্নলিখিত সিনট্যাক্সের অনুমতি দেয় (যেখানে libসমস্ত জাভা সংরক্ষণাগার ফাইল যুক্ত ডিরেক্টরি রয়েছে):

java -cp $(echo lib/*.jar | tr ' ' ':')

(নোট করুন যে ক্লাসপথ ব্যবহার করা -jarবিকল্পের সাথে সামঞ্জস্যপূর্ণ নয় also আরও দেখুন: কমান্ড প্রম্পট থেকে একাধিক ক্লাসপাথ লাইব্রেরি সহ জার ফাইলটি কার্যকর করুন )

ওয়াইল্ডকার্ডগুলি বোঝা

থেকে ক্লাসপাথ দস্তাবেজ:

শ্রেণীর পাথ এন্ট্রিগুলিতে বেসনাম ওয়াইল্ডকার্ড অক্ষর থাকতে পারে *, যা এক্সটেনশান সহ .jarবা ডিরেক্টরিতে সমস্ত ফাইলের তালিকা নির্দিষ্ট করার সমতুল্য বলে বিবেচিত হয় .JAR। উদাহরণস্বরূপ, শ্রেণীর পাথ এন্ট্রি foo/*foo নামের ডিরেক্টরিতে সমস্ত JAR ফাইল সুনির্দিষ্ট করে। একটি ক্লাসপথ এন্ট্রি কেবল *বর্তমান ডিরেক্টরিতে সমস্ত জার ফাইলের তালিকায় প্রসারিত থাকে।

একটি শ্রেণীর পাথ এন্ট্রিতে যা *ক্লাস ফাইলগুলির সাথে মেলে না। একক ডিরেক্টরি foo এ দুটি ক্লাস এবং জেআর ফাইল মিলিয়ে নিতে, হয় হয় foo;foo/*বা ব্যবহার করুন foo/*;foo। নির্বাচিত ক্রমটি নির্ধারণ করে যে ক্লাস এবং সংস্থানগুলি fooJAR ফাইলগুলিতে প্রবেশ করার আগে fooবা বিপরীতে load

উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসন্ধান করা হয় না। উদাহরণস্বরূপ, foo/*শুধুমাত্র JAR- র ফাইলের জন্য সৌন্দর্য foo, নেই foo/bar, foo/bazইত্যাদি

কোনও ডিরেক্টরিতে জেআর ফাইলগুলি ক্রমবর্ধমান শ্রেণীর পথে গণিত করা হয় তা নির্দিষ্ট করা হয়নি এবং একই মেশিনে প্ল্যাটফর্ম থেকে প্ল্যাটফর্ম এবং এমনকি মুহুর্তেও মুহুর্তে পরিবর্তিত হতে পারে। একটি ভাল-নির্মিত অ্যাপ্লিকেশন কোনও নির্দিষ্ট আদেশের উপর নির্ভর করবে না। যদি কোনও নির্দিষ্ট আদেশের প্রয়োজন হয় তবে জআআআআর ফাইলগুলি শ্রেণি পথে পরিষ্কারভাবে গণনা করা যেতে পারে।

ক্লাস-লোডিং প্রক্রিয়া চলাকালীন স্বয়ং দেরি না করে প্রোগ্রামের মূল পদ্ধতিটি আহ্বানের আগে, প্রথম দিকে ওয়াইল্ডকার্ডগুলির সম্প্রসারণ করা হয়। ওয়াইল্ডকার্ডযুক্ত ইনপুট শ্রেণীর পাথের প্রতিটি উপাদানকে নামকৃত ডিরেক্টরিতে 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শিরোনামে সম্মানিত হয় না ।

দ্রষ্টব্য: জাভা 8 তে জানা বাগের কারণে, উইন্ডোজ উদাহরণগুলিতে অবশ্যই একটি ব্যাকস্ল্যাশ পূর্ববর্তী প্রবেশদ্বার অবশ্যই চলন্তের নক্ষত্র সহ ব্যবহার করতে হবে: https://bugs.openjdk.java.net/browse/JDK-8131329


2
বৈশিষ্ট্যটি খারাপভাবে নথিভুক্ত করা হয়েছে এবং মনে হয় কাজ করার জন্য কিছু কম-সুস্পষ্ট প্রাক-শর্তগুলি সন্তুষ্ট হওয়া দরকার।
অ্যালেক্স আর

1
শেষ বাশ / ট্র ট্রিকের জন্য +1। এখানে জাভা / জ্যামভিএম কার্যকরী ডিরেক্টরিটির বাইরে পাথের জন্য ওয়াইল্ডকার্ড পছন্দ করে না, তবে শেল ওয়াইল্ডকার্ড + trকাজ ব্যবহার করে প্রতিটি জেআর উল্লেখযোগ্যভাবে উল্লেখ করছে !

1
আমার কোনও কমান্ড java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassছাড়াই কমান্ড রয়েছে এবং এটি ঠিক আছে works আমি ভাবছি শেল কেন এটি প্রসারিত করছে না এবং ত্রুটিযুক্ত হচ্ছে না?
ইয়েললাভন

3
~-Cp- এও ব্যবহার করবেন না
সোহেল সি

1
আপনার উইন্ডোজ উদাহরণ জাভা 8 বা তার আগের কাজ করে না, তবে এই শ্রেণিপথের সাথে: টেস্ট.জার; লাইব \ * ... ফরোয়ার্ড স্ল্যাশ একটি নক্ষত্রের
philwalk

226

উইন্ডোসের নিচে এটি কাজ করে:

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

আমি খুঁজে পেয়েছি যে ক্লাসপথগুলির ক্রমটি গুরুত্বপূর্ণ (তবে কেন জানি না)। আমি ক্লাসপ্যাথগুলির ক্রম পরিবর্তন না করা পর্যন্ত ত্রুটি পেয়েছি।
ব্যবহারকারী 13107

@ জেএমর্ট ২৫৩, জিনিসটি হ'ল এটি শেল * প্রসারিত নয়, তবে ওয়াইল্ডকার্ড ক্লাসপাথটি পার্স করছে, * দেখছে এবং ওয়াইল্ডকার্ডটি পূরণ করছে
সেবাস্তিয়ান

1
@ সেবাস্তিয়ানগোডলেট - হ্যাঁ, রেগেক্স ওয়াইল্ডকার্ড এবং এই স্বরলিপিটির মধ্যে কেবল আমার বিভ্রান্তি ঘটছে, যা আমি অনুমান করি না। বেশিরভাগ ক্ষেত্রে, যা আমাকে বাঁচিয়েছিল তা হ'ল :এক প্ল্যাটফর্মে এবং অন্যটিতে পার্থক্য জেনে ;। :) আমি জাভাটি প্রতি বছরে প্রায় একবার কমান্ড লাইন থেকে সংকলন করি, বিরক্তিকর হওয়ার জন্য কতক্ষণ যথেষ্ট যথেষ্ট তা মনে রাখার জন্য যথেষ্ট নয়।
jmort253

67

আমরা এই মূল জার ফাইলটি স্থাপন করে myapp.jarযা ম্যানিফেস্ট ( Manifest.mf) ফাইল অন্তর্ভুক্ত করে অন্যান্য প্রয়োজনীয় জারের সাথে একটি শ্রেণিপথ নির্দিষ্ট করে, তারপরে এটি পাশাপাশি স্থাপন করা হয়। এই ক্ষেত্রে, আপনাকে কেবল ঘোষণা করতে হবেjava -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
অক্সবো_লকের উত্তর সম্পূর্ণ সঠিক নয়; ক্লাস-পাথ জিনিসটি সম্মানিত হয় (এবং কেবল সম্মানিত; -সিপি / -ক্লাসপাথ উপেক্ষা করা হয়!) আপনি যদি এই জারটি জাভা-মাইয়ার.এপ.জার দিয়ে শুরু করেন। আমি অক্সবো_লাক্সকে বোঝাতে চাইছিলাম যখন সে 'জাভা-ক্লাসপাথ মাইয়াপ.জার' লিখেছিল write
rzwitserloot

47

"লিব" ডিরেক্টরিতে সমস্ত জার থাকা জাভা-সূর্য 1.6.0_24 ব্যবহার করে উবুন্টু 10.04 এ আমার সমাধান:

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

যদি এটি ব্যর্থ হয়, নিম্নলিখিত কমান্ডটি কাজ করবে (ক্লাবপথের উপর লিবিব ডিরেক্টরিতে সমস্ত * .jars মুদ্রণ করে)

java -cp $ (আমার জন্য lib / *। জারে; ইকো-এন $ i:; সম্পন্ন)। my.main.Class

4
একটি মজার নোট java -cp lib / * my.main.Class সর্বদা ব্যর্থ হবে কারণ শেল গ্লোব বিস্তৃত হবে lib / *, যখন জাভা -cp।: lib / * my.main.Class হবে না কারণ:: lib / * একটি বৈধ গ্লোব নয় পথ। কিছুক্ষণ খেয়াল করুন
আলফফান

1
এটা কাজ করে না; লিনাক্স প্রসারিত হবে । আপনি চেষ্টা করতে পারেন: java -cp '।: lib / ' এবং এটি দুর্দান্ত কাজ করে (একক উদ্ধৃতি নোট করুন! এটি ডাবল উদ্ধৃতি দিয়ে কাজ করবে না!)। আসলে,।: Lib / * কাজ করতে পারে যদি কোলনের কারণে এটি কোনও আইনী গ্লোব না হয় তবে এটি কিছুটা স্বচ্ছন্দ বোধ করে। আমি উদ্ধৃতি যোগ করব। একক উদ্ধৃতি বিষয়বস্তুর কোনও অংশ স্পর্শ না করতে বাশকে বলে।
rzwitserloot

আপনি একক বা ডাবল উদ্ধৃতি ব্যবহার করলে (এই প্রসঙ্গে) কিছু যায় আসে না। আপনি শেলটি * * প্রসারিত (গ্লোব্বিং) থেকে আটকাতে চান, এটিই যথেষ্ট। এবং "lib / *" পাঠ্যটি JVM তে স্বাক্ষরিত করুন, সুতরাং ভিএম এটিকে একটি "বিশেষ প্যাটার্ন" হিসাবে স্বীকৃতি দেয় এবং জার ফাইলগুলির জন্য নিজে অনুসন্ধান করে।
অ্যাঞ্জেল ও'স্ফিয়ার

36

সংক্ষিপ্ত উত্তর: java -classpath lib/*:. my.package.Program

ওরাকল ক্লাসপথগুলিতে জাভা 6 এর জন্য ওয়াইল্ডকার্ডগুলি ব্যবহার করার জন্য এবং এখানে জাভা 7 এর জন্য ক্লাস পাথ ওয়াইল্ডকার্ডগুলি বোঝার বিভাগের অধীনে ডকুমেন্টেশন সরবরাহ করে । (আমি এটি লিখতে হিসাবে, দুটি পৃষ্ঠায় একই তথ্য রয়েছে)) এখানে হাইলাইটগুলির সংক্ষিপ্তসার:

  • সাধারণভাবে, প্রদত্ত ডিরেক্টরিতে সমস্ত জারগুলি অন্তর্ভুক্ত করার জন্য, আপনি ওয়াইল্ডকার্ড *( না *.jar ) ব্যবহার করতে পারেন ।

  • ওয়াইল্ডকার্ড কেবল জারদের সাথে মেলে, শ্রেণিবদ্ধ ফাইলগুলি নয়; ডিরেক্টরিতে সমস্ত ক্লাস পেতে, কেবল ডিরেক্টরি নামে ক্লাসপাথ এন্ট্রি শেষ করুন।

  • উপরোক্ত দুটি অপশন একত্রিত করে সমস্ত জেআর এবং ক্লাস ফাইলগুলিকে একটি ডিরেক্টরিতে অন্তর্ভুক্ত করা যেতে পারে এবং সাধারণ ক্লাসপাথ অগ্রাধিকারের নিয়ম প্রয়োগ হয়। যেমন-cp /classes;/jars/*

  • ওয়াইল্ডকার্ড সাব-ডিরেক্টরিতে JARs অনুসন্ধান করবে না for

  • উপরের বুলেট পয়েন্টগুলি সত্য যদি আপনি CLASSPATHসিস্টেমের সম্পত্তি -cpবা -classpathকমান্ড লাইনের পতাকা ব্যবহার করেন। তবে, আপনি যদি Class-Pathজেআর ম্যানিফেস্ট শিরোনাম ব্যবহার করেন (যেমন আপনি কোনও পিঁপড়া বিল্ড ফাইল দিয়ে করতে পারেন), ওয়াইল্ডকার্ডগুলি সম্মানিত হবে না

হ্যাঁ, আমার প্রথম লিঙ্কটি শীর্ষ-স্কোরিং উত্তরের (যা আমার ছাড়ার কোন আশা রাখে না) সরবরাহ করা একই, তবে সেই উত্তরটি লিঙ্কটির বাইরে খুব বেশি ব্যাখ্যা সরবরাহ করে না। যেহেতু আজকাল স্ট্যাক ওভারফ্লোতে এই ধরণের আচরণকে নিরুৎসাহিত করা হয়েছে , তাই আমি ভেবেছিলাম যে আমি এটির প্রসারিত করব।


আমার সমস্যা ছিল lib / * এর চেয়ে lib / *। jar নিয়ে। অনেক ধন্যবাদ এটি এটি স্থির করে। আমি লক্ষ্য করেছি যে: এবং; তবে এটি আমার পরীক্ষামূলক-একই সময়ে একই ধরণের জিনিস হতে পারে।
ইয়াদ ইব্রাহিম


36

উইন্ডোজ :

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

লিনাক্স :

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

স্মরণ করিয়ে দিন:
- উইন্ডোজ পাথ বিভাজক ;
- লিনাক্স পাথ বিভাজক :
- উইন্ডোজে সিপি আর্গুমেন্টে সাদা স্থান না থাকলে "উদ্ধৃতি" "চ্ছিক


উইন্ডোজ উদাহরণ জাভা 8 এবং তার আগে কাজ করে না: দেখুন bugs.openjdk.java.net/browse/JDK-8131329
ফিলওয়াক

হয়তো নেই খোলা JDK জন্য কাজ না, আমি এই পরীক্ষা হবে এবং আমি এখানে সম্পর্কে কথা বলতে হবে
Wender

দুঃখিত, আমি হটস্পট দিয়ে পরীক্ষা করেছি এবং আমার মনে হয় যে ওপেনডিজকে দিয়ে কাজ করে।
Wender

উইন্ডোজের নীচে ওরাকল জাভা ফোরওয়ার্ড স্ল্যাশের পরিবর্তে অ্যাসিটার্কের আগে একটি ব্যাকস্ল্যাশ প্রয়োজন, যদিও আমি খুব সাম্প্রতিক বা বিকল্প জাভা সংস্করণগুলি পুনরায় পরীক্ষা করিনি n't
ফিলওয়াক

ম্যাকোজে কাজ করে না
গ্রেশ্যাক

34

আমার জন্য এটি উইন্ডোতে কাজ করে।

java -cp "/lib/*;" sample

লিনাক্স জন্য

java -cp "/lib/*:" sample

আমি জাভা 6 ব্যবহার করছি


উইন্ডোজ উদাহরণ জাভা 6, সম্ভবত জাভা 7 এর জন্য কাজ করেছে বলে মনে হয় তবে জাভা 8 এর জন্য নয় (দেখুন bugs.openjdk.java.net/browse/JDK-8131329 )
ফিলওয়াক

লিনাক্সে জাভা 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 সংস্করণ ক্লাসপথে পাসের কাজ করেছেন। গতানুগতিক রূপটি হয়নি।
ম্যাট ক্যাম্পবেল

23

সঠিক :

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

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

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


8

দয়া করে নোট করুন যে উইন্ডোজে জাভা 7 এর জন্য ওয়াইল্ডকার্ড সম্প্রসারণ নষ্ট হয়েছে।

পরীক্ষা করে দেখুন এই Stackoverflow ইস্যু আরও তথ্যের জন্য।

কর্মক্ষেত্রটি হ'ল ওয়াইল্ডকার্ডের ঠিক পরে অর্ধসীমা স্থাপন করা। java -cp "somewhere/*;"


6

যাহার জন্য প্রযোজ্য,

আমি একটি এমএসওয়াইএস / মিনজিডাব্লু শেলের অধীনে উইন্ডোজটিতে এই অদ্ভুত আচরণটি পেয়েছি।

কাজ করে:

$ 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একই ফলাফল সহ অন্তর্নির্মিতের চেয়ে অন্য প্রোগ্রামের সাথেও এটি চেষ্টা করে দেখে ))

আমি বিশ্বাস করি এটিই javacযা এটি প্রসারিত করার চেষ্টা করছে এবং যুক্তিতে সেমিকোলন রয়েছে কিনা তা ভিন্নভাবে আচরণ করে। প্রথমত, এটি সমস্ত আর্গুমেন্টগুলি পাথের মতো দেখতে প্রসারিত করার চেষ্টা করছে। এবং কেবলমাত্র এটি -cpকেবলমাত্র নীচের টোকেনটি নিয়ে তাদের পার্স করবে । (দ্রষ্টব্য এটি com.comsol.aco_1.0.0.jarসেই ডিরেক্টরিতে দ্বিতীয় জেআর)) এটি সমস্ত অনুমান।

এই

$ javac -version
javac 1.7.0

5

উপরের সমস্ত সমাধান দুর্দান্তভাবে কাজ করে যদি আপনি কোনও IDE বা Eclipse বা Netbeans এর মতো জাভা অ্যাপ্লিকেশনটি বিকাশ করে এবং চালিত করেন।

আপনি যদি উইন্ডোজ 7 এ থাকেন এবং জাভাতে ডেভলপমেন্টের জন্য এক্সিলিপ আইডিই ব্যবহার করেন, আপনি যদি কমান্ড প্রম্পটটি ব্যবহার করে Eclipse এর অভ্যন্তরে নির্মিত ক্লাস ফাইলগুলি চালনা করতে পারেন তবে আপনি সমস্যাগুলি হতে পারে।

উদাহরণস্বরূপ Eclipse এ আপনার উত্স কোডটিতে নিম্নলিখিত প্যাকেজ শ্রেণিবদ্ধতা রয়েছে: edu.sjsu.myapp.Main.java

মেইন.জাবায় বাহ্যিক নির্ভরতা হিসাবে আপনার কাছে জসন.জার রয়েছে

আপনি যখন Eclipse এর মধ্যে থেকে Main.java চালানোর চেষ্টা করবেন, এটি কোনও সমস্যা ছাড়াই চলবে।

তবে আপনি যখন ইক্লিপসে মেইন.জাভা সংকলনের পরে কমান্ড প্রম্পট ব্যবহার করে এটি চালানোর চেষ্টা করবেন, এটি "ক্লাসনটডেফ ত্রুটি ব্লাহ ব্লাহ" বলে কিছু অদ্ভুত ত্রুটি চিহ্নিত করবে।

আমি ধরে নিই যে আপনি আপনার সোর্স কোডের ওয়ার্কিং ডিরেক্টরিতে রয়েছেন !!

কমান্ড প্রম্পট থেকে এটি চালনার জন্য নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করুন:

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

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

    [মিস করবেন না। উপরে]

এর কারণ আপনি প্যাকেজের ভিতরে মেইন.জাভা রেখেছেন edu.sjsu.myapp এবং java.exe সঠিক প্যাটার্নটি সন্ধান করবে।

আশা করি এটা সাহায্য করবে !!


4

উইন্ডোজের জন্য উদ্ধৃতিগুলি প্রয়োজনীয় এবং; বিভাজক হিসাবে ব্যবহার করা উচিত। উদাহরণ:

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

4

সংক্ষিপ্ত ফর্ম: যদি আপনার মূলটি একটি জারের মধ্যে থাকে তবে আপনার সম্ভবত সম্ভবত অতিরিক্ত একটি 'জাজার পাথো / আপনার জার / আপনার জারনাম.জাজার' প্রয়োজন হবে এটি পরিষ্কারভাবে ঘোষণা করার জন্য এটি কাজ করার জন্য (যদিও 'আপনার জার্স নেম.জার' ক্লাসপথে ছিল)) (বা , 5 বছর আগে জিজ্ঞাসা করা মূল প্রশ্নের উত্তরের জন্য প্রকাশিত: আপনার প্রতিটি জারটি স্পষ্টভাবে পুনরায় বিবরণ করার দরকার নেই, তবে মনে হয়, জাভা with সহ আপনার নিজের জারের পুনরায় বিবরণ করা দরকার ...)


দীর্ঘ ফর্ম: (আমি এটি এই স্পষ্টে প্রকাশ করেছি যে আমি আশা করি এমনকি জাভাতেও আন্তঃলিপিরা এটি ব্যবহার করতে পারে)

এখানে অনেকের মতো আমি জার রফতানি করতে গ্রহণ করছি: (ফাইল-> রফতানি -> 'চলমান জেআর ফাইল')। 'লাইব্রেরি হ্যান্ডলিং' গ্রহণের (জুনো) অফারে তিনটি বিকল্প রয়েছে:

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"

সাধারণত আমি অপ্ট 2 ব্যবহার করতাম (এবং অপ্ট 1 অবশ্যই ভেঙেছিল) তবে আমি যে জারগুলিতে ব্যবহার করছি তার একটিতে নেটিভ কোড আমি হ্যান্ডি "জারিনজার" ট্রিকের সাথে ব্রেকগুলি আবিষ্কার করেছি যা আপনি যখন এই বিকল্পটি বেছে নেবেন তখন গ্রহগ্রহণের উত্সব লাভ করবে। আমার অপট ৩ প্রয়োজন বুঝতে পেরে এবং তারপরেও এই স্ট্যাকওভারফ্লো এন্ট্রিটি সন্ধান করার পরেও, আমি কীভাবে আমার গ্রহের গ্রহের বাইরে আমার মূল প্রবর্তন করতে পারি তা নির্ধারণ করতে আমার কিছুটা সময় লেগেছিল, সুতরাং এটি আমার জন্য কী কাজ করেছে, কারণ এটি অন্যদের জন্য দরকারী ...


যদি আপনি আপনার জারের নাম রেখেছেন: "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

(জাভা নিউবিইজের জন্য: 'প্যাকেজ.পাথ_ টু_থ্লাস_উইথ.ইউর_মাইন' হ'ল একটি ঘোষিত প্যাকেজ-পাথ যা আপনি '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-তে ওপেনজেডিকে 64-বিট সার্ভার ভিএম এর মাধ্যমে)


3

একমাত্র উপায় আমি কীভাবে জানি এটি পৃথকভাবে কীভাবে করা যায়, উদাহরণস্বরূপ:

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

আশা করি এইটি কাজ করবে!


এটি '08-এ ফিরে যাওয়ার একমাত্র উপায় হতে পারে তবে আর নয়।
simo.3792

এটি সবচেয়ে খারাপ জিনিস নয়। এটি হ্যাক, তবে আমার এই বাশার্কে এই সেটটি রয়েছেfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
ডিভন পেটিকোলাস

3

ওয়েপআপ থেকে ক্লাস:

  > 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

/ * টু-সিপি সেট করতে সক্ষম হওয়ার সরাসরি সমাধান নয় তবে আমি আশা করি গতিশীল শ্রেণী-পথ এবং lib ডিরেক্টরিগুলির জন্য পরিস্থিতিটি কিছুটা স্বাচ্ছন্দ করতে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন।

 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" তে রফতানি করবে।


2

ম্যাকোস, বর্তমান ফোল্ডার

ম্যাকোস মোজাভেতে জাভা 13 এর জন্য …

আপনার সমস্ত .jarফাইল যদি একই ফোল্ডারে থাকে তবে cdএটি আপনার বর্তমান কার্যক্ষম ডিরেক্টরি তৈরি করতে ব্যবহার করুন । দিয়ে যাচাই করুনpwd

আপনার জন্য -classpathআপনাকে প্রথমে আপনার অ্যাপ্লিকেশনের জন্য জেআর ফাইলটি তালিকাবদ্ধ করতে হবে । :ডিলিমিটার হিসাবে কোলন চরিত্রটি ব্যবহার করে , *একই ফোল্ডারের মধ্যে অন্যান্য সমস্ত জেআর ফাইলগুলি পেতে একটি নক্ষত্র যুক্ত করুন । শেষ অবধি, আপনার mainপদ্ধতি সহ শ্রেণীর পুরো প্যাকেজ নামটি পাস করুন ।

উদাহরণস্বরূপ, নামে এক বয়াম ফাইলে একটি অ্যাপ্লিকেশন জন্য my_app.jarএকটি সঙ্গে mainনামে একজন ক্লাসে পদ্ধতি Appনামে একটি প্যাকেজের মধ্যে com.example, একই ফোল্ডারে কিছু প্রয়োজন বয়াম পাশাপাশি:

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


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

অথবা

জাভা-সিপি / হোম / সেলিয়াস / স্ট্যাটমেট্রিক্স / স্ট্যাটমেট্রিক্স.জার:। org.statmetrics.Statmetrics

অথবা

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -জার / হোম / সেলিয়াস / স্ট্যাটমিক্স / স্ট্যাটমেট্রিক্স.জার org.statmetics. স্ট্যাটমেট্রিক্স

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

এটি সফলভাবে চালানো হয়েছিল!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.