ความแตกต่างของคำนำหน้า classpath ฤดูใบไม้ผลิ


141

เอกสารที่นี่มันระบุ

คำนำหน้าพิเศษนี้ระบุว่าทรัพยากร classpath ทั้งหมดที่ตรงกับชื่อที่กำหนดจะต้องได้รับ (ภายในสิ่งนี้เกิดขึ้นเป็นหลักผ่านการเรียก ClassLoader.getResources (... )) จากนั้นผสานเพื่อสร้างนิยามบริบทของแอปพลิเคชันสุดท้าย

มีคนอธิบายเรื่องนี้ได้ไหม

อะไรคือความแตกต่างระหว่างการใช้classpath*:conf/appContext.xmlเมื่อเทียบกับที่classpath:conf/appContext.xmlไม่มีเครื่องหมายดอกจัน


ผู้อ่านในอนาคตจะเห็นข้อผิดพลาดนี้พร้อมกับ "status = ปฏิเสธ" github.com/spring-projects/spring-framework/issues/16017 ในกรณีที่ URL ล้มเหลวในที่สุดชื่อของโพสต์บั๊กคือ "การนำเข้าไฟล์ XML จากรากของไฟล์ JAR ที่มี wildcard classpath และ wildcard path ไม่ทำงาน [SPR-11390] "
granadaCoder

คำตอบ:


207

คำจำกัดความง่าย ๆ

classpath*:conf/appContext.xmlก็หมายความว่าไฟล์ appContext.xml ทั้งหมดภายใต้confโฟลเดอร์ในขวดทั้งหมดของคุณบน classpath จะถูกหยิบขึ้นมาและเข้าร่วมในบริบทแอพลิเคชันขนาดใหญ่

ในทางตรงกันข้ามclasspath:conf/appContext.xmlจะโหลดไฟล์เดียวเท่านั้น ... ไฟล์แรกที่พบใน classpath ของคุณ


6
มีความแตกต่างที่น่าสนใจอีกประการหนึ่งระหว่างพวกเขา ดูคำถามของฉันด้วย: stackoverflow.com/questions/16985770/ …
Eugene

27
สิ่งหนึ่งที่สำคัญมาก - ถ้าคุณใช้ * และ Spring พบว่าไม่มีข้อมูลตรงกันมันจะไม่บ่น หากคุณไม่ได้ใช้ * และไม่มีการแข่งขันบริบทจะไม่เริ่มต้นขึ้น (!)
Roy Truelove

39

classpath*:...ไวยากรณ์เป็นประโยชน์หลักเมื่อคุณต้องการสร้างบริบทโปรแกรมจากแฟ้มคำจำกัดความถั่วหลายใช้ไวยากรณ์สัญลักษณ์แทน

ตัวอย่างเช่นถ้าคุณสร้างบริบทของคุณโดยใช้classpath*:appContext.xmlclasspath จะถูกสแกนสำหรับทุกทรัพยากรที่เรียกว่าappContext.xmlใน classpath และคำจำกัดความของถั่วจากพวกเขาทั้งหมดรวมเข้ากับบริบทเดียว

ในทางตรงกันข้ามclasspath:conf/appContext.xmlจะได้รับหนึ่งไฟล์เท่านั้นที่เรียกว่าappContext.xmlจาก classpath หากมีมากกว่าหนึ่งรายการอื่น ๆ จะถูกละเว้น


2
classpath * จะดูในไดเรกทอรีย่อยด้วยหรือไม่ กล่าวอีกนัยหนึ่งถ้าฉันมี appContext.xml ในรูทคลาสและอีกอันใน /dir/appContext.xml มันจะโหลดทั้งคู่เมื่อฉันใช้คลาสพา ธ *: 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

เอกสารทางการ "เป็นไปไม่ได้ที่จะใช้ classpath *: คำนำหน้าเพื่อสร้างจริงResourceเป็นทรัพยากรชี้ไปที่ทรัพยากรเพียงหนึ่งครั้ง" บวกฉันเพิ่งได้รับข้อผิดพลาดแปลก ๆ นั่นคือวิธีที่ฉันลงเอยที่นี่ หากคุณกำลังจะนำเข้าทรัพยากรดังนั้นคุณไม่ควรใช้คำเสริมหน้า classpath ของ wildcard
GabrielOshiro

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.