1. Préface
Dans des circonstances normales, le Classloader ne peut trouver que le fichier * .class dans le répertoire actuel ou la classe de fichiers dans le pot. Afin de charger les ressources dans le pot imbriqué, le dossier de classe dans le pot imbriqué et le dossier de classe de la demande sont emballés dans un pot, de sorte qu'il n'y a pas de pot imbriqué. Cependant, ce faisant, vous ne pouvez pas savoir clairement de quoi dépend l'application et lesquelles sont l'application elle-même. De plus, le contenu de la classe dans plusieurs pots peut être différent, mais les noms de fichiers sont les mêmes. Spring-Boot-chargedeur à Springboot est né pour résoudre ce problème gracieusement.
Le module Spring-Boot-chargeur nous permet d'utiliser Java -Jar Archive.jar pour exécuter des fichiers JAR ou WAR contenant des dépendances imbriquées. Il fournit trois types de lanceurs (Jarlauncher, Warlauncher et PropertiesLauncher). Le but de ces lanceurs de classe est de pouvoir charger des ressources imbriquées dans le pot (comme les fichiers de classe, les fichiers de configuration, etc.). [JAR | WAR] Lanceur recherche fixement des ressources dans les fichiers JAR imbriqués dans le répertoire Lib du pot actuel.
2. La structure du répertoire du pot fournie par le module Spring-Boot-chargeur
Le format de fichier JAR à Springboot est corrigé comme suit:
archive.jar | + -Meta-Inf (1) | + -Manifest.mf + -org (2) | + -SpringFramework | + -boot | + -loader | + - <Classes de chargeur de démarrage Spring> + -com (3) | + -MyCompany | + Projet | + -Youclasses.class + -lib (4) + -dependency1.jar + -dependency2.jar
Alors, comment Spring-Boot charge-t-il les ressources en fonction de cette structure?
Classe principale: org.springframework.boot.loader.jarlauncher start-classe: com.mycompany.project.myapplication
Et copier le fichier de classe dans le package Spring-Boot-chargeur sur la structure (2), copiez la dépendance de l'application dans (4) Copiez la classe d'application en (3)
3. Analyse du processus de plug-in de spring-boot-maven-plugin
Remarque: Ici, nous devons réfléchir à la raison pour laquelle nous devons copier la classe pour structurer (2) qui aurait dû être placée dans le spring-boot-chargedeur.jar que nous aurions dû mettre dans la lib?
4. Analyse du processus d'exécution de Jarlauncher
Après avoir lu ce processus, nous analyserons les problèmes restants dans la troisième section. Par exemple, l'organigramme utilise d'abord AppClassLoader pour charger la classe Jarlauncher et créer la classe LankEdUrlClassLoader. Le LaunsedUrlClassloader appartient au package Spring-Boot-chargedeur.jar, et l'AppClassloader est un chargeur ordinaire qui ne peut pas charger les fichiers dans le pot imbriqué. Par conséquent, si Spring-Boot-chargedeur.jar est placé dans le répertoire Lib, l'AppClassloader ne trouvera pas le LaunseDurlClassloader. Alors lors de l'emballage
Copiez la classe pour structurer (2) qui aurait dû être placée dans le printemps-boot-wocher.jar dans lib.
5. Résumé
Le module Spring-Boot-chargement implémente élégamment le chargement des ressources de pot imbriquées via une structure de package de pot personnalisée. En réinitialisant la classe de démarrage et la structure du pot d'organisation pendant l'emballage et la définition d'un chargeur personnalisé au moment de l'exécution pour réaliser des ressources de pot imbriquées.