আমি রানটাইম এবং সংকলন-সময়ের মধ্যে পার্থক্য এবং উভয়ের মধ্যে পার্থক্য কীভাবে বুঝতে পারি তা বুঝতে পারি তবে আমি কেবল সংকলন-সময় এবং রানটাইম নির্ভরতাগুলির মধ্যে পার্থক্য করার প্রয়োজন দেখছি না।
সাধারণ সংকলন-সময় এবং রানটাইম ধারণা এবং মাভেন নির্দিষ্ট compile
এবং runtime
স্কোপ নির্ভরতা দুটি খুব আলাদা জিনিস different এগুলি একই ফ্রেম না থাকায় আপনি সরাসরি তাদের তুলনা করতে পারবেন না: সাধারণ সংকলন এবং রানটাইম ধারণাগুলি বিস্তৃত হয় যখন মভেন compile
এবং runtime
স্কোপ ধারণাগুলি নির্দিষ্টভাবে নির্ভর করে সময় অনুযায়ী নির্ভরতা উপলব্ধতা / দৃশ্যমানতা: সংকলন বা সম্পাদন।
ভুলে যাবেন না যে মাভেন সমস্ত javac
/ java
র্যাপারের উপরে এবং জাভাতে আপনার একটি সংকলন টাইম ক্লাসপাথ রয়েছে যা আপনি নির্দিষ্ট করেছেন javac -cp ...
এবং একটি রানটাইম ক্লাসপথ যা আপনি নির্দিষ্ট করেছেন java -cp ...
। জাভা সংকলন এবং রানটাইম ক্লাসপাথে উভয়ই নির্ভরতা যুক্ত করার উপায় হিসাবে ম্যাভেন স্কোপটিকে
বিবেচনা করা ভুল হবে না compile
(javac
এবং java
) যখন ম্যাভেন runtime
স্কোপটি কেবল জাভা রানটাইম ক্লাসপ্যাথ ( javac
) তে নির্ভরতা যুক্ত করার উপায় হিসাবে দেখা যেতে পারে ।
আমি যা ঘাটাঘাটি করছি তা হ'ল: সংকলনের সময় কোনও প্রোগ্রাম কীভাবে রানটাইমের সময় এমন কোনও কিছুর উপর নির্ভর করতে পারে না?
আপনি যা বর্ণনা করেছেন তার সাথে কোনও সম্পর্ক নেই runtime
compile
সুযোগ ও সুযোগ নেই।
এটি provided
স্কোপের চেয়ে আরও বেশি মনে হচ্ছে যা আপনি সংকলনের সময় নির্ভর করে তবে রানটাইম নয়, নির্ভরতার জন্য নির্দিষ্ট করেছেন।
সংকলনের জন্য আপনার নির্ভরতার প্রয়োজন হিসাবে আপনি এটি ব্যবহার করেন তবে আপনি এটি প্যাকেজযুক্ত উপাদানটিতে (জেআর, ওয়ার বা অন্য কোনও) অন্তর্ভুক্ত করতে চান না কারণ নির্ভরতা ইতিমধ্যে পরিবেশের দ্বারা সরবরাহ করা হয়েছে: এটি সার্ভারে বা অন্য কোনওটিতে অন্তর্ভুক্ত করা যেতে পারে জাভা অ্যাপ্লিকেশন হিসাবে নির্দিষ্ট ক্লাসপথের পথ শুরু হয়েছে।
যদি আমার জাভা অ্যাপ্লিকেশন লগ 4j ব্যবহার করে, তবে এটির জন্য লগ 4j.jar ফাইলের প্রয়োজন (লগ 4j এর অভ্যন্তর থেকে সদস্য পদ্ধতিগুলির সাথে আমার কোড সংহত করা এবং অনুরোধ করা) পাশাপাশি রানটাইম (লগ 4j এর অভ্যন্তরে একবার কোড কী হবে তার উপর আমার কোডের একেবারেই কোনও নিয়ন্ত্রণ নেই) .জার চালানো হয়)।
এই ক্ষেত্রে হ্যাঁ। তবে মনে করুন যে আপনাকে একটি পোর্টেবল কোড লিখতে হবে যা পরে অন্য লগিং প্রয়োগের দিকে যেতে (লগ 4 জ 2, লগব্যাক বা অন্য কোনও) সারণী করতে log4j এর সামনের দিকে মুখ হিসাবে Slf4j এর উপর নির্ভর করে।
আপনি পম ক্ষেত্রে এই ক্ষেত্রে আপনাকে compile
নির্ভরতা হিসাবে slf4j নির্দিষ্ট করতে হবে (এটি ডিফল্ট) তবে আপনি লগ 4j নির্ভরতা নির্ভরতা হিসাবে নির্দিষ্ট করবেন runtime
:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
<scope>runtime</scope>
</dependency>
এইভাবে, সংযুক্ত কোডে লগ 4 জ ক্লাসগুলি রেফারেন্স করা যায়নি তবে আপনি এখনও slf4j ক্লাসগুলি উল্লেখ করতে সক্ষম হবেন।
যদি আপনি compile
সময়ের সাথে দুটি নির্ভরতা নির্দিষ্ট করে থাকেন তবে কোনও কিছুই আপনাকে সঙ্কলিত কোডে লগ 4 জে ক্লাস উল্লেখ করতে বাধা দেবে না এবং আপনি লগিং প্রয়োগের সাথে একটি অনাকাঙ্ক্ষিত মিলন তৈরি করতে পারেন:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
</dependency>
runtime
সুযোগের একটি সাধারণ ব্যবহার হল জেডিবিসি নির্ভরতা ঘোষণা decla পোর্টেবল কোড লেখার জন্য, আপনি চান না যে ক্লায়েন্ট কোড নির্দিষ্ট ডিবিএমএস নির্ভরতার ক্লাসগুলি উল্লেখ করতে পারে (উদাহরণস্বরূপ: পোস্টগ্রিসএসকিউএল জেডিবিসি নির্ভরতা) তবে আপনি রানটাইম হিসাবে ক্লাসগুলি তৈরি করার জন্য প্রয়োজনীয় সমস্ত প্রয়োগগুলিকে আপনার প্রয়োগে অন্তর্ভুক্ত করতে চান জেডিবিসি এপিআই এই ডিবিএমএসের সাথে কাজ করে।