1. Pendahuluan
Dalam keadaan normal, ClassLoader hanya dapat menemukan file *.class di direktori saat ini atau kelas file di JAR. Untuk memuat sumber daya dalam toples bersarang, file kelas di toples bersarang dan file kelas aplikasi dikemas ke dalam toples, sehingga tidak ada toples bersarang. Namun, dengan melakukannya, Anda tidak dapat dengan jelas tahu apa yang diandalkan oleh aplikasi dan mana yang merupakan aplikasi itu sendiri. Selain itu, konten kelas dalam beberapa stoples mungkin berbeda tetapi nama filenya sama. Spring-Boot-Loader di Springboot lahir untuk menyelesaikan masalah ini dengan anggun.
Modul Spring-Boot-Loader memungkinkan kita untuk menggunakan java -jar archive.jar untuk menjalankan file jar atau perang yang berisi dependensi bersarang. Ini menyediakan tiga jenis peluncur (Jarlauncher, Warlauncher dan PropertiesLauncher). Tujuan peluncur kelas ini adalah untuk dapat memuat sumber daya yang bersarang di JAR (seperti file kelas, file konfigurasi, dll.). [JAR | WAR] Peluncur dengan benar mencari sumber daya dalam file JAR bersarang di direktori LIB dari JAR saat ini.
2. Struktur Direktori JAR yang disediakan oleh Modul Spring-Boot-Loader
Format file jar dalam springboot diperbaiki sebagai berikut:
archive.jar | +-Meta-inf (1) | +-Manifest.mf +-org (2) | +-springframework | +-Boot | +-Loader | +-<Kelas Spring Boot Loader> +-com (3) | +-mycompany | + Proyek | +-YoUclasses.class +-lib (4) +-dependency1.jar +-dependency2.jar
Jadi bagaimana sumber daya beban pegas sesuai dengan struktur ini?
Kelas Utama: org.springframework.boot.loader.jarlauncher kelas mulai: com.mycompany.project.myapplication
Dan salin file kelas dalam paket spring-boot-loader ke struktur (2), salin ketergantungan aplikasi ke (4) salin kelas aplikasi ke (3)
3. Analisis Proses Kemasan Plug-In-Boot-Maven-Plugin
Catatan: Di sini kita perlu memikirkan mengapa kita perlu menyalin kelas untuk menyusun (2) yang seharusnya dimasukkan ke dalam boot-boot-loader.jar yang seharusnya kita masukkan ke dalam lib?
4. Analisis proses eksekusi Jarlauncher
Setelah membaca proses ini, kami akan menganalisis masalah yang tersisa di bagian ketiga. Misalnya, diagram alur pertama menggunakan AppClassLoader untuk memuat kelas Jarlauncher dan membuat kelas LaunchedURLClassLoader. LaunchedUrlClassloader milik paket spring-boot-loader.jar, dan AppClassloader adalah loader biasa yang tidak dapat memuat file dalam toples bersarang. Oleh karena itu, jika spring-boot-loader.jar ditempatkan di direktori LIB, AppClassLoader tidak akan menemukan LaunchedUrlClassLoader. Jadi saat berkemas
Salin kelas untuk menyusun (2) yang seharusnya dimasukkan ke dalam spring-boot-loader.jar di lib.
5. Ringkasan
Modul beban pegas-boot dengan elegan mengimplementasikan pemuatan sumber daya toples bersarang melalui struktur paket JAR khusus. Dengan mengatur ulang kelas startup dan struktur toples organisasi selama pengemasan, dan menetapkan loader khusus saat runtime untuk mencapai sumber jar bersarang.