के साथ सेवाएं मैं एक प्लगइन मॉड्यूल बनाना चाहता था जिसे ServiceLoader
से लोड किया जा सकता है। इसके लिए META-INF/services
निर्देशिका में फ़ाइल जोड़ने की आवश्यकता है, जिसका नाम सेवा इंटरफ़ेस के नाम पर रखा गया है और इसमें उस वर्ग के योग्यता पथ शामिल हैं जो इसे लागू करता है। फिर आप ServiceLoader.load()
पर कॉल करके इन सेवाओं को लोड कर सकते हैं।मेटा-आईएनएफ/जीएआर में मेटल
हम org.example.plugins.PluginService
नामक एक प्लगइन इंटरफ़ेस प्रदान करना चाहते हैं कहते हैं:
यहाँ एक उदाहरण है। इसके बाद हम कक्षा org.example.plugins.impl.ExamplePlugin
कक्षा में इस सेवा का कार्यान्वयन प्रदान करते हैं।
अगर हम कुछ प्रकार की प्लगइन तंत्र चाहते हैं, तो हम एक जेएआर फ़ाइल बना सकते हैं, जिसमें कार्यान्वयन शामिल है। इस JAR फ़ाइल में फ़ाइल META-INF/services/org.example.plugins.PluginService
भी होनी चाहिए। इस फ़ाइल में कार्यान्वयन को खोजने के लिए ServiceLoader
सक्षम करने के लिए एक पंक्ति
org.example.plugins.impl.ExamplePlugin
शामिल होना चाहिए। कि JAR फ़ाइल का निर्माण पथ में है, तो आप
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
कि इटरेटर कॉल करते समय भी सभी प्लग इन कि ServiceLoader
से पाए जाते हैं पहुँच प्रदान करेगा द्वारा प्लगइन लोड कर सकते हैं।
किसी कारण से ग्रैडल में फ़ाइलों को META-INF
निर्देशिका में डिफ़ॉल्ट रूप से शामिल नहीं किया गया है। परिणामस्वरूप जेएआर को ऐसी फाइल रखने का कोई तरीका है?
मुझे कक्षा Jar
में पहले से ही metaInf
विधि मिली है। लेकिन मुझे अपने आप को हल करने के लिए पर्याप्त अच्छा नहीं पता है।
क्या आप निश्चित हैं? मेरे लिए ठीक काम करता है। आप इस फ़ाइल को कहां रखते हैं और आपका 'build.gradle' कैसे दिखता है? – axtavt
मुख्य स्रोत फ़ोल्डर 'src/main/java' में' मेटा-आईएनएफ 'निर्देशिका है। बिल्ड स्क्रिप्ट के साथ कुछ खास नहीं है। यह लगभग एक मानक है, जिसमें कुछ अतिरिक्त निर्भरताएं और कुछ कस्टम भंडार शामिल हैं। – pvorb