1. คำนำ
ภายใต้สถานการณ์ปกติ classloader สามารถค้นหาไฟล์ *.class ในไดเรกทอรีปัจจุบันหรือคลาสไฟล์ใน JAR เท่านั้น ในการโหลดทรัพยากรในขวดที่ซ้อนกันไฟล์คลาสในขวดที่ซ้อนกันและไฟล์คลาสของแอปพลิเคชันจะถูกบรรจุไว้ในขวดเพื่อไม่ให้ขวดซ้อนกัน อย่างไรก็ตามในการทำเช่นนั้นคุณไม่สามารถรู้ได้อย่างชัดเจนว่าแอปพลิเคชันขึ้นอยู่กับอะไรและแอปพลิเคชันตัวไหน นอกจากนี้เนื้อหาคลาสในขวดหลายขวดอาจแตกต่างกัน แต่ชื่อไฟล์เหมือนกัน Spring-Boot-Loader ใน Springboot เกิดมาเพื่อแก้ปัญหานี้อย่างสง่างาม
โมดูล Spring-Boot-Loader ช่วยให้เราสามารถใช้ Java -jar Archive.jar เพื่อเรียกใช้ Jar หรือไฟล์สงครามที่มีการพึ่งพาซ้อนกัน มันมีปืนกลสามประเภท (Jarlauncher, Warlauncher และ Propertieslauncher) วัตถุประสงค์ของตัวเรียกใช้งานคลาสเหล่านี้คือการโหลดทรัพยากรที่ซ้อนกันใน JAR (เช่นไฟล์คลาสไฟล์การกำหนดค่า ฯลฯ ) [JAR | WAR] Launcher ค้นหาทรัพยากรอย่างสม่ำเสมอในไฟล์ JAR ที่ซ้อนกันในไดเรกทอรี LIB ของ JAR ปัจจุบัน
2. โครงสร้างไดเรกทอรี JAR ที่จัดทำโดยโมดูลสปริงบูท-โหลดเดอร์
รูปแบบไฟล์ JAR ใน SpringBoot ได้รับการแก้ไขดังนี้:
Archive.jar | +-meta-inf (1) | +-Manifest.mf +-org (2) | +-SpringFramework | +-boot | +-loader | +-<คลาส SPRING BOOT LOADER> +-COM (3) | +-MyCompany | + โครงการ | +-youclasses.class +-lib (4) +-dependency1.jar +-dependency2.jar
ดังนั้นทรัพยากรโหลดสปริงบูทตามโครงสร้างนี้อย่างไร
Main-class: org.springframework.boot.load.jarlauncher เริ่มต้นคลาส: com.mycompany.project.myapplication
และคัดลอกไฟล์คลาสในแพ็คเกจ Spring-Boot-Loader ไปยังโครงสร้าง (2), คัดลอกการพึ่งพาแอปพลิเคชันไปที่ (4) คัดลอกคลาสแอปพลิเคชันไปที่ (3)
3. การวิเคราะห์กระบวนการบรรจุภัณฑ์ปลั๊ก
หมายเหตุ: ที่นี่เราต้องคิดว่าทำไมเราต้องคัดลอกคลาสไปยังโครงสร้าง (2) ที่ควรใส่ลงใน Spring-Boot-loader.jar ที่เราควรใส่ลงไปใน Lib?
4. การวิเคราะห์กระบวนการดำเนินการ Jarlauncher
หลังจากอ่านกระบวนการนี้เราจะวิเคราะห์ปัญหาที่เหลืออยู่ในส่วนที่สาม ตัวอย่างเช่น FlowChart เป็นครั้งแรกใช้ AppClassLoader เพื่อโหลดคลาส Jarlauncher และสร้างคลาส LaunchDURLCLASSLOADER LaunchDurlClassLoader เป็นของแพ็คเกจ Spring-Boot-loader.jar และ AppClassLoader เป็นตัวโหลดธรรมดาที่ไม่สามารถโหลดไฟล์ในขวดที่ซ้อนกันได้ ดังนั้นหาก Spring-boot-loader.jar ถูกวางไว้ในไดเรกทอรี lib แอปพลิเคชันจะไม่พบผู้เปิดตัว ดังนั้นเมื่อบรรจุ
คัดลอกคลาสไปยังโครงสร้าง (2) ที่ควรใส่ลงใน Spring-Boot-loader.jar ใน lib
5. สรุป
โมดูลสปริงบู๊ท-โหลดโหลดอย่างหรูหราใช้การโหลดทรัพยากรขวดซ้อนกันผ่านโครงสร้างแพ็คเกจขวดที่กำหนดเอง โดยการรีเซ็ตโครงสร้างเริ่มต้นและโครงสร้าง JAR ขององค์กรระหว่างบรรจุภัณฑ์และตั้งค่าตัวโหลดที่กำหนดเองที่รันไทม์เพื่อให้ได้ทรัพยากร JAR ซ้อนกัน