मैं रनटाइम और संकलन-समय के बीच के अंतर को समझता हूं और दोनों के बीच अंतर कैसे करता हूं, लेकिन मुझे अभी संकलन-समय और रनटाइम निर्भरता के बीच अंतर करने की आवश्यकता नहीं है।
सामान्य संकलन-समय और रनटाइम अवधारणाएं और मावेन विशिष्ट compile
और runtime
गुंजाइश निर्भरताएं दो बहुत अलग चीजें हैं। आप सीधे उनकी तुलना नहीं कर सकते क्योंकि इनमें समान फ्रेम नहीं है: सामान्य संकलन और रनटाइम अवधारणाएं व्यापक हैं, जबकि मावेन compile
और runtime
गुंजाइश अवधारणाएं समय के अनुसार विशेष रूप से निर्भरता उपलब्धता / दृश्यता के बारे में हैं: संकलन या निष्पादन।
मत भूलो कि मावेन सभी एक javac
/ java
आवरण से ऊपर है और जावा में आपके पास एक संकलन समय क्लासपाथ है जिसे आप निर्दिष्ट करते हैं javac -cp ...
और एक रनटाइम क्लासपैथ जिसे आप निर्दिष्ट करते हैं java -cp ...
। जावा कंपाइल और रनटाइम टेंपरेचर (दोनों में एक निर्भरता जोड़ने के तरीके के रूप
में मावेन compile
गुंजाइश पर विचार करना गलत नहीं होगा )javac
और java
) जबकि मावेन runtime
गुंजाइश को केवल जावा रनटाइम क्लासपैथ ( javac
) में एक निर्भरता जोड़ने के तरीके के रूप में देखा जा सकता है ।
मैं इस पर मज़ाक कर रहा हूं: कोई प्रोग्राम रनटाइम के दौरान किसी चीज़ पर निर्भर नहीं रह सकता है जो कि संकलन के दौरान उस पर निर्भर था?
आप जो वर्णन करते हैं उसका कोई संबंध नहीं है runtime
और compile
गुंजाइश नहीं है।
यह उस provided
दायरे की तरह दिखता है जो आप एक निर्भरता के लिए निर्दिष्ट करते हैं कि वह संकलन के समय पर निर्भर हो लेकिन रनटाइम पर नहीं।
आप इसे संकलन के लिए निर्भरता की आवश्यकता के रूप में उपयोग करते हैं लेकिन आप इसे पैक किए गए घटक (JAR, WAR या किसी अन्य) में शामिल नहीं करना चाहते हैं क्योंकि निर्भरता पहले से ही पर्यावरण द्वारा प्रदान की जाती है: इसे सर्वर या किसी भी में शामिल किया जा सकता है जावा अनुप्रयोग के रूप में निर्दिष्ट क्लासपाथ का पथ।
यदि मेरा जावा ऐप log4j का उपयोग करता है, तो उसे संकलन करने के लिए log4j.jar फ़ाइल की आवश्यकता है (मेरा कोड log4j के अंदर से सदस्य विधियों को एकीकृत करने और इनवॉइस करने के लिए) और साथ ही रनटाइम (मेरा कोड log4j के अंदर क्या कोड है, इस पर कोई नियंत्रण नहीं है। .जर भाग गया)।
इस मामले में हाँ। लेकिन मान लीजिए कि आपको एक पोर्टेबल कोड लिखने की ज़रूरत है जो log4j के सामने फीके के रूप में slf4j पर निर्भर करता है जो बाद में किसी अन्य लॉगिंग कार्यान्वयन (log4J 2, लॉगबैक या किसी अन्य) पर स्विच करने में सक्षम हो।
इस स्थिति में, पोम में आपको slf4j को एक compile
निर्भरता के रूप में निर्दिष्ट करना होगा (यह डिफ़ॉल्ट है) लेकिन आप एक runtime
निर्भरता के रूप में log4j निर्भरता को निर्दिष्ट करेंगे :
<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>
इस तरह, संकलित कोड में log4j वर्गों को संदर्भित नहीं किया जा सकता है, लेकिन आप फिर भी slf4j वर्गों को संदर्भित करने में सक्षम होंगे।
यदि आपने compile
समय के साथ दो निर्भरताएं निर्दिष्ट की हैं , तो कुछ भी आपको संकलित कोड में log4j कक्षाओं को संदर्भित करने से नहीं रोकेगा और आप लॉगिंग कार्यान्वयन के साथ अवांछनीय युग्मन बना सकते हैं:
<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
गुंजाइश का एक सामान्य उपयोग जेडीबीसी निर्भरता घोषणा है। पोर्टेबल कोड लिखने के लिए, आप नहीं चाहते हैं कि क्लाइंट कोड विशिष्ट DBMS निर्भरता (उदाहरण के लिए: PostgreSQL JDBC निर्भरता) की कक्षाओं को संदर्भित कर सकता है, लेकिन आप सभी इसे अपने आवेदन में शामिल करना चाहते हैं, क्योंकि रनटाइम के दौरान कक्षाओं को बनाने की आवश्यकता होती है JDBC API इस DBMS के साथ काम करता है।