स्प्रिंग क्लासपैथ उपसर्ग अंतर


141

प्रलेखित यहाँ यह कहा गया

यह विशेष उपसर्ग निर्दिष्ट करता है कि दिए गए नाम से मेल खाने वाले सभी क्लासपैथ संसाधनों को प्राप्त किया जाना चाहिए (आंतरिक रूप से, यह अनिवार्य रूप से क्लासलोआडर.गेटसूट्स सोर्स (...) कॉल के माध्यम से होता है, और फिर अंतिम एप्लिकेशन संदर्भ परिभाषा बनाने के लिए विलय कर दिया जाता है।

क्या कोई इसे समझा सकता है?

तारांकन के बिना classpath*:conf/appContext.xmlविरोध के रूप में उपयोग करने के बीच अंतर क्या है classpath:conf/appContext.xml


भविष्य के पाठक, इस बग को "स्थिति = अस्वीकृत" के साथ भी देखते हैं। github.com/spring-projects/spring-framework/issues/16017 यदि URL अंततः विफल हो जाता है, तो बग पोस्ट का शीर्षक "वाइल्डकार्ड क्लासपाथ और वाइल्डकार्ड पथ से JAR फ़ाइल के रूट से XML फ़ाइल का आयात है" काम नहीं करता है [SPR-11390] "
ग्रान्डाकर

जवाबों:


207

सरल परिभाषा

classpath*:conf/appContext.xmlका अर्थ है कि सभी appContext.xml फ़ाइलों के तहत confclasspath पर अपने सभी जार में फ़ोल्डरों उठाया जाएगा और एक बड़ा आवेदन संदर्भ में शामिल हो गए।

इसके विपरीत, इस तरह की केवल एक फ़ाइलclasspath:conf/appContext.xml लोड होगी ... पहला जो आपके वर्गपथ पर पाया जाता है।


6
उनके बीच एक और दिलचस्प अंतर है। मेरा प्रश्न भी देखें: stackoverflow.com/questions/16985770/…
यूजीन

27
एक बहुत ही महत्वपूर्ण बात - यदि आप * और स्प्रिंग का कोई मिलान नहीं है, तो यह शिकायत नहीं करेगा। यदि आप * का उपयोग नहीं करते हैं और कोई मिलान नहीं हैं, तो संदर्भ प्रारंभ नहीं होगा (!)
रॉय ट्रूवेलोव

39

classpath*:...मुख्य रूप से जब आप एकाधिक सेम परिभाषा फ़ाइलों से एक आवेदन संदर्भ निर्माण करने के लिए वाइल्डकार्ड सिंटैक्स का उपयोग चाहते वाक्य रचना उपयोगी है।

उदाहरण के लिए, यदि आप अपने संदर्भ का उपयोग कर निर्माण करते हैं classpath*:appContext.xml , तो वर्गपथ को कक्षापाठ appContext.xmlमें बुलाए गए प्रत्येक संसाधन के लिए स्कैन किया जाएगा , और उन सभी से सेम परिभाषाएँ एक ही संदर्भ में विलय हो गईं।

इसके विपरीत, क्लासपाथ से classpath:conf/appContext.xmlएक और केवल एक फ़ाइल प्राप्त की जाएगी appContext.xml। यदि एक से अधिक है, तो दूसरों की अनदेखी की जाएगी।


2
क्या वर्गपथ * उपनिर्देशिकाओं में भी दिखेगा? दूसरे शब्दों में, अगर मेरे पास classpath रूट में appContext.xml है और एक /dir/appContext.xml में है, तो जब मैं classpath *: appContext.xml का उपयोग करता हूं तो क्या यह लोड होगा?
AHungerArtist

21

classpath *: यह संसाधनों की एक सूची को संदर्भित करता है और classpath में मौजूद ऐसी सभी फाइलों को लोड करता है और सूची खाली हो सकती है और यदि कोई ऐसी फाइल classpath में मौजूद नहीं है, तो एप्लिकेशन किसी अपवाद को नहीं फेंकता है (बस त्रुटि को अनदेखा करता है)।

classpath: यह एक निश्चित संसाधन को संदर्भित करता है और केवल classpath पर मिली पहली फ़ाइल को लोड करता है और यदि कोई ऐसी फ़ाइल classpath में मौजूद नहीं है, तो यह एक अपवाद को फेंक देगा

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

आधिकारिक डॉक्टर "क्लासपैथ * का उपयोग करना संभव नहीं है: एक वास्तविक निर्माण के लिए उपसर्ग Resource, एक समय में केवल एक संसाधन के लिए एक संसाधन इंगित करता है।" प्लस मुझे बस यह अजीब त्रुटि मिली, यही कारण है कि मैं यहां समाप्त हुआ। यदि आप संसाधन आयात करने जा रहे हैं तो वाइल्डकार्ड क्लासपैथ उपसर्ग का उपयोग करने का कोई मतलब नहीं है।
गैब्रियलऑशिरो

0

वसंत का स्रोत कोड:

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}  

क्या आप समझा सकते हैं?
RtmY
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.