জাভা: আমি কীভাবে কোডের একটি সম্পূর্ণ ডিরেক্টরি কাঠামো সংকলন করতে পারি?


84

ব্যবহার ক্ষেত্রে সহজ। গ্রহনটি ব্যবহার করে তৈরি করা উত্স ফাইলগুলি পেয়েছি। সুতরাং, একটি গভীর ডিরেক্টরি কাঠামো রয়েছে, যেখানে যে কোনও জাভা শ্রেণি একই, শিশু, ভাইবোন বা পিতা বা মাতা ফোল্ডারে অন্য জাভা শ্রেণির উল্লেখ করতে পারে।

জাভ্যাক ব্যবহার করে টার্মিনাল থেকে এই পুরো জিনিসটি কীভাবে সংকলন করব?


কৌতূহলের বাইরে আপনি কোন ওএস ব্যবহার করছেন - উইন্ডোজ, লিনাক্স, ম্যাক ইত্যাদি? এটি প্রশ্নের উত্তর দিতে সহায়তা করতে পারে
জ্যাচ এল

4
আমি কয়েক বছর ধরে কমান্ড লাইনে জাভা সংকলন করি নি তবে আমি মনে করি আপনি যদি কেবলমাত্র আপনার মূল () সম্বলিত ফাইলটি জাভাকে পাস করেন তবে এটি আপনার সমস্ত নির্ভরতা হতে পারে বলে অন্যান্য সমস্ত ফাইল সংকলনের জন্য অনুসন্ধান করবে will প্রধান ()যুক্ত ফাইল থেকে শুরু করে আবিষ্কার করেছেন।
এন্ডোফেজ

উত্তর:


59

আপনাকে সমস্ত ডিরেক্টরি জানতে বা ওয়াইল্ডকার্ড ব্যবহার করতে সক্ষম হতে হবে ..

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

4
আমি এটি আবিষ্কার করেছি: জাভায়ের পরে সমস্ত জাভা ফাইলের নাম বা ওয়াইল্ডকার্ড ব্যবহার করে কেবল তালিকাবদ্ধ করুন।
আনন্দময় 83

54
বা শুধু ব্যবহার javac $(find . -name "*.java")
জর্জি স্কলি


41

আপনি যা করতে চান তা যদি আপনার প্রধান ক্লাসটি চালানো হয় (যে .javaফাইলগুলি প্রধান শ্রেণীর উপর নির্ভর করে না সেগুলি সংকলন না করে), তবে আপনি নিম্নলিখিতটি করতে পারেন:

cd <root-package-directory>
javac <complete-path-to-main-class>

বা

javac -cp <root-package-directory> <complete-path-to-main-class>

javac সমস্ত নির্ভরতা স্বয়ংক্রিয়ভাবে সমাধান করবে এবং সমস্ত নির্ভরতাও সংকলন করবে।


4
এটি এখন পর্যন্ত সবচেয়ে সহজ কার্যকর সমাধান। মানুষ কেন এটি পছন্দ করে না?
আলফায়া

12
সম্ভবত কারণ এর সরলতা এই বিষয়টিকে উপেক্ষা করে যে লাইব্রেরি বা সমর্থন কোডের জন্য অনেকগুলি সংকলিত চাকরিতে সমস্ত প্রয়োজনীয় নির্ভরতার সাথে সংযোগ স্থাপনের একটি মূল পদ্ধতি থাকবে না। এটি একটি ভাল উত্তর, তবে আমি কোনও ফ্রেমওয়ার্ক / পাবলিক কোডবেসে কখনও ব্যবহার করব না not
আজাক্স

4
আইএমএইচও, ফ্রেমওয়ার্ক বা অন্য যে কোনও পাবলিক প্রকল্পগুলির একধরনের বিল্ড ম্যানেজমেন্ট ব্যবহার করা উচিত। এই ধরনের সংকলন, কেবল ছোট বেসরকারী প্রকল্পগুলিতেই বোঝা যায়।
Svenwltr

@ অজ্যাক্স তবে যদি এটি হয় তবে আপনি -sourcepath .বিকল্পটি ব্যবহার করতে পারেন এবং তারপরে একই প্রভাবটির জন্য মূল ফাইলটির নাম দিন
কোডরেচেট

4
কে বলেছে একটা মেইন আছে? কে বলেছে চারজন মেইন নেই? আপনার আউটপুটে আপনি চান এমন প্রতিটি শ্রেণি কি এমনকি মূল দ্বারা রেফারেন্স করা হয় (এবং মেটা-আইএনএফ / পরিষেবাগুলি বা অন্যান্য পরিষেবা লোডিং কৌশল ব্যবহার করে না)। যদি আপনি যা করছেন তার সবই যদি একটি প্রধান পরীক্ষা করে দেখানো হয় তবে এই পদ্ধতিটি ঠিক আছে, তবে "প্রদত্ত ডিরেক্টরিতে সমস্ত জাভা ফাইল সংকলন" করার সম্পূর্ণ কার্যটি সম্বোধন করতে ব্যর্থ হয়। একটি যথাযথ বিল্ড সিস্টেম হ'ল # 1, ক্লাইম সরঞ্জামগুলি find . -type f -name "*.java" | xargs javac 2 নম্বর, এবং এই পদ্ধতিটি কেবল তখনই থাকে যখন কোনও একক মূল পদ্ধতির প্রবেশ পয়েন্ট থাকে যা পুরো অ্যাপ্লিকেশনটিকে ঘিরে থাকে।
আজাক্স

12

আমি জোন নিতে হবে পরামর্শ গ্রহণ করব এবং পিঁপড়াকে ব্যবহার করব, কারণ এটি একটি অত্যন্ত জটিল কাজ complex

যাইহোক, যদি আপনি টার্মিনাল এক লাইনে এটা সব পেতে নির্ধারিত হয়, লিনাক্স আপনি ব্যবহার করতে পারে খোঁজ কমান্ড। তবে আমি এটি মোটেও প্রস্তাব দিচ্ছি না, যেহেতু এর কোনও গ্যারান্টি নেই, বলুন যে, Fooব্যবহার করেও, ফু.জভা বার.জভা পরে সংকলিত হবে Bar। একটি উদাহরণ হবে:

find . -type f -name "*.java" -exec javac {} \;

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


4
উইন্ডোতে find_gnu . -type f -name "*.java" | xargs javacএকবার একবার find.exe এর gnu সংস্করণটি find_gnu.exe নামকরণ হয়ে গেলে ব্যবহার করতে পারে । আমি আমার gnu খুঁজে পেয়েছি। Msysgit থেকে।
n611x007

বা খাঁটি উইন্ডোজ ব্যাচে: for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f(এতে একক ব্যাক-কোট ব্যবহার করুন dir /s /bতবে আমি এটি সঠিকভাবে ফর্ম্যাট করার উপায় খুঁজে পাই না)।
ম্যাথিউউ

আমি মনে করি findসমাধানটি সমস্যাযুক্ত কারণ এটি প্রতিটি জাভা ক্লাসকে পৃথকভাবে সংকলন করে, এটি খুব ধীর করে তোলে।
অ্যালিকেলিন-কিলাকা

12

নিম্নলিখিত পদ্ধতিটি আমি খুঁজে পেয়েছি:

1) একটি ফাইলের মধ্যে ফাইলগুলির আপেক্ষিক পাথের সাথে একটি তালিকা তৈরি করুন (ফাইললিস্ট.টেক্সট বলুন) নীচে (স্থান পৃথক করা বা লাইন পৃথক করা):

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

2) কমান্ডটি ব্যবহার করুন:

javac @FilesList.txt -d classes

এটি সমস্ত ফাইলগুলি সংকলন করবে এবং শ্রেণি ফাইলগুলি ক্লাস ডিরেক্টরিতে রাখবে।

ফাইললিস্ট. টেক্সট তৈরি করার সহজ উপায় হ'ল: আপনার উত্সের রুট ডিরেক্টরিতে যান।

dir *.java /s /b > FilesList.txt

তবে এটি নিখুঁত পাথকে জনসাধারণ করে তুলবে। একটি পাঠ্য সম্পাদক ব্যবহার করে "সমস্ত প্রতিস্থাপন করুন" উত্স ডিরেক্টরিতে পাথ (শেষে include অন্তর্ভুক্ত করুন) "" (অর্থাত্ খালি স্ট্রিং) এবং সংরক্ষণ করুন।


এই javac সহায়তা হিসেবে একটি "ব্যাচ" ফাইল আরো "নেটিভ" উপায়,
lovespring

"দির *। জাভা </ b> ফাইললিস্ট.টেক্সট" পন্থাটি যদি কোনও পাথের ফাঁকিতে থাকে তবে কাজ করবে না। জাভ্যাক ফাইললিস্ট.টেক্সট সম্পর্কে অভিযোগ করবে
15

10

ইতিমধ্যে বিদ্যমান উত্তরগুলি কেবল নিজের নিজের নিজের জন্যই *। জাভা ফাইলগুলি নিয়ে উদ্বেগ বলে মনে হচ্ছে এবং কীভাবে এটি নির্মাণের জন্য প্রয়োজনীয় লাইব্রেরি ফাইলগুলি কীভাবে সহজে করবেন তা নয়।

একটি দুর্দান্ত এক-লাইন পরিস্থিতি যা পুনরাবৃত্তভাবে সমস্ত *। জাভা ফাইল পায় পাশাপাশি বিল্ডিংয়ের জন্য প্রয়োজনীয় * .jar ফাইল অন্তর্ভুক্ত করে:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)

এখানে বিন ফাইলটি ক্লাস ফাইলগুলির গন্তব্য, লাইব (এবং সম্ভাব্য বর্তমান ওয়ার্কিং ডিরেক্টরি) লাইব্রেরী ফাইলগুলি অন্তর্ভুক্ত করে এবং এসসিআর ডিরেক্টরিতে এবং নীচে থাকা সমস্ত জাভা ফাইলগুলি সংকলিত হয়।


সোয়াগার দ্বারা উত্পন্ন ক্লায়েন্ট উত্স কোডটি সংকলন করতে আমার একটি সমস্যা হচ্ছে
ইভিনভিন্সিবল

9

এই শ্রেণিবদ্ধভাবে করতে আপনাকে পিঁপড়ার মতো কিছু ব্যবহার করতে হবে:

http://ant.apache.org/manual/Tasks/javac.html

নিম্নলিখিতটি সংকলিত একটি লক্ষ্য সহ আপনার একটি বিল্ড স্ক্রিপ্ট তৈরি করতে হবে:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>

তারপরে আপনি চালিয়ে সমস্ত ফাইল সংকলন করতে সক্ষম হবেন:

 ant compile

বিকল্পভাবে, আপনার প্রকল্পটি Eclipse এ আমদানি করুন এবং এটি স্বয়ংক্রিয়ভাবে সেই প্রকল্পের সমস্ত উত্স ফাইলগুলি সংকলন করবে।


দুর্ভাগ্যক্রমে, এটি এমন সার্ভারে করা হবে যা পিপীলাকে সমর্থন করে না।
আনন্দময় 83

2

পাইপের চরিত্রটি ব্যবহার না করেই এটি করার একটি উপায় রয়েছে, যা আপনি যদি অন্য প্রোগ্রামিং ভাষা থেকে কোনও প্রক্রিয়াটি করতে এটি করতে আগ্রহী হন তবে সুবিধাজনক:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

আপনি যদি বাশে থাকেন এবং / বা পাইপ ব্যবহার করতে কিছু মনে করেন না তবে আপনি এটি করতে পারেন:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR

2

উইন্ডোজ সমাধান: উপ-ডিরেক্টরি 'src' এর মধ্যে থাকা সমস্ত ফাইল ধরে নেওয়া এবং আপনি সেগুলি 'বিন' তে সংকলন করতে চান।

for /r src %i in (*.java) do javac %i -sourcepath src -d bin

যদি এসআরসি-তে এর ঠিক পরে নীচে একটি জাভা ফাইল থাকে তবে এটি আরও দ্রুত

javac src\\*.java -d bin

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