1. Prefacio
En circunstancias normales, el cargador de clases solo puede encontrar el archivo *.class en el directorio actual o la clase de archivo en el jar. Para cargar los recursos en el JAR anidado, el archivo de clase en el JAR anidado y el archivo de clase de la aplicación se empaquetan en un JAR, de modo que no hay JAR anidado. Sin embargo, al hacerlo, no puede saber claramente de qué depende la aplicación y cuáles son la aplicación en sí. Además, el contenido de clase en múltiples frascos puede ser diferente, pero los nombres de archivo son los mismos. Spring-Boot Loader en Springboot nació para resolver este problema con gracia.
El módulo Spring-Boot-Loader nos permite usar Java -jar Archive.jar para ejecutar archivos JAR o de guerra que contienen dependencias anidadas. Proporciona tres tipos de lanzadores (Jarlauncher, Warlauncher y PropertiesLauncher). El propósito de estos lanzadores de clases es poder cargar recursos anidados en el JAR (como archivos de clase, archivos de configuración, etc.). [JAR | War] Lanzador busca fijamente recursos en archivos JAR anidados en el directorio LIB del JAR actual.
2. La estructura del directorio JAR proporcionada por el módulo de cargador de boot spring
El formato de archivo JAR en SpringBoot se soluciona de la siguiente manera:
Archive.jar | +-Meta-Inf (1) | +-Manifest.mf +-org (2) | +-SpringFramework | +-Boot | +-loader | +-<clases de cargador de arranque de primavera> +-com (3) | +-mycompany | + Proyecto | +-YouClasses.class +-lib (4) +-dependency1.jar +-dependency2.Jar
Entonces, ¿cómo se carga los recursos de Boot Spring-Boot según esta estructura?
Clase principal: org.springframework.boot.loader.jarlauncher start-class: com.mycompany.project.myapplication
Y copie el archivo de clase en el paquete Spring-Boot-Loader a la estructura (2), copie la dependencia de la aplicación a (4) Copie la clase de aplicación a (3)
3. Análisis del proceso de empaque de plugin-boot-boot-plugin
Nota: Aquí debemos pensar por qué necesitamos copiar la clase a la estructura (2) que debería haberse puesto en el boot-boot-carger.jar que deberíamos haber puesto en LIB.
4. Análisis del proceso de ejecución de Jarlauncher
Después de leer este proceso, analizaremos los problemas que quedan en la tercera sección. Por ejemplo, el diagrama de flujo usa primero AppClassLoader para cargar la clase Jarlauncher y crear la clase LaunchedUrlClassLoader. El LateDedUrlClassLoader pertenece al paquete Spring-Boot-Loader.jar, y el AppClassLoader es un cargador ordinario que no puede cargar los archivos en el JAR anidado. Por lo tanto, si Spring-Boot-Loader.jar se coloca en el directorio LIB, el AppClassLoader no encontrará el LateDedUrlClassLoader. Entonces al empacar
Copie la clase a la estructura (2) que debería haberse colocado en el boot-boot-boot-loader.jar en lib.
5. Resumen
El módulo Spring-Boot-Load implementa elegantemente la carga de recursos de JAR anidados a través de una estructura de paquete JARS personalizado. Al restablecer la clase de inicio y la estructura del frasco de la organización durante el embalaje, y establecer un cargador personalizado en tiempo de ejecución para lograr recursos de JAR anidados.