您的位置
主页 > 社会新闻 » 正文

Spring-Boot启动之前做了哪些事

来源:www.casa-soler.com 点击:910

前锋JAVA开发学院2019.9.5我要分享

Spring Boot Jar文件浏览

初始化Spring应用程序并添加以下依赖项

运行mvn package命令以查看jar包的目录结构。

需要使用tree命令,可以直接在Windows下使用树,Mac需要安装brew install树

文件结构比较复杂,请解释

BOOT-INF/classes:存储应用程序的已编译类文件;

BOOT-INF/lib:类路径目录,该目录存储用于应用程序依赖项的jar包;

META-INF:存储有关该应用程序的元信息,例如MANIFEST.MF文件;

组织:存储Spring Boot自己的类文件; Jar文件执行程序: Spring Boot Loader

我们首先从MANIFEST.MF文件中查看它

它记录应用程序的元信息,Spring的版本,应用程序的版本,Maven的版本和Main-Class。不难发现MainClass指向org.springframework.boot.loader.JarLauncher(以下称为JarLauncher),而不是我们自己的com.fxipp.spring.FirstAppByGuiApplication。

JarLauncher是名称的jar执行程序。他的类文件位于org.springframework.boot.loader目录中。可以看出,它是Spring自己的类文件。

JarLauncher的GAV org.springframework.boot: spring-boot-loader: 2.1.6.RELEASE

通常,他将以spring-boot-starter-parent引入应用程序。由于主类指向JarLauncher,因此我们还可以直接执行java org.springframework.boot.loader.JarLauncher或启动Spring项目。的。

由于它可以执行,因此表明JarLauncher类是Spring项目的真正入口点。如果我们执行自己的com.fxipp.spring.FirstAppByGuiApplication,怎么办?

启动错误的原因是找不到org.springframework.boot.SpringApplication类。简而言之,没有指定类路径。 Spring Boot应用程序的类路径目录是BOOT-INF/lib。

换句话说,JarLauncher可以成功执行,因为Spring Boot知道类路径的路径,这表明JarLauncher在开始调用com.fxipp.spring.FirstAppByGuiApplication之前指定了类路径的位置。

JarLauncher的代码如下

Archive.Entry:此类对对象表示jar包中的资源文件。

isNestedArchive方法确定入口对象是否在jar包中。如果它在罐子里,则返回true。如果它不在jar包中,也就是说,我们解压缩了jar包,然后直接java org.springframework.boot.loader.JarLauncher启动,它将返回false。专注于launch(String)方法

此方法共有3个步骤

扩展JAR协议

JDK默认情况下支持文件,http,jar和其他协议,因此JDK内部有一个默认实现,该实现位于sun.net.软件包下。

JarFile.registerUrlProtocolHandler;此方法在org.springframework.boot.loader软件包下实现了相应的JAR协议,涵盖了原始的JAR实现。

由于最初的JAR实现,因此我们是在自己配置环境变量而不是BOOT-INF/lib时开发ClassPath的。创建一个类加载器以加载JarLauncher类,因为jar包可能未压缩,并且解压缩前后的ClassLoader是不同的。

调用启动方法以传递参数。

Args是我们自己的参数。

getMainClass用于获取MANIFEST.MF文件中的Stir-Class属性,即获取我们自定义主类的Class文件地址。

传递已启动的类加载器启动方法

启动方法分析:

将ClassLoader放在当前线程的ClassLoader中

创建一个MainMethodRunner对象并在其中调用run方法。

run方法首先获取先前设置的ClassLoader。

使用ClassLoader加载诸如Start-Class之类的类,这是我们自己的主类。

在主类中获取main方法并通过反射执行它。总结

通过分析,我们可以看到Spring Boot Loader在调用我们自己的主类之前做了三件事

扩展的JDK默认情况下支持兼容JAR的协议,因为Spring Boot不仅会启动JDK半长JAR文件,还会启动BOOT-INF/lib目录中的文件。默认实现无法将BOOT-INF/lib目录视为ClassPath,因此需要替换该实现。

确定当前媒体是java-jar启动还是java org.springframework.boot.loader.JarLauncher。为了获得相应的ClassLoader。

在MANIFEST.MF文件中获取Start-Class属性,该文件是我们的自定义主类。加载在第二步中获得的ClassLoader以获得Class文件,并通过反射调用main方法以启动应用程序。

收款报告投诉

Spring Boot Jar文件浏览

初始化Spring应用程序并添加以下依赖项

运行mvn package命令以查看jar包的目录结构。

需要使用tree命令,可以直接在Windows下使用树,Mac需要安装brew install树

文件结构比较复杂,请解释

BOOT-INF/classes:存储应用程序的已编译类文件;

BOOT-INF/lib:类路径目录,该目录存储用于应用程序依赖项的jar包;

META-INF:存储有关该应用程序的元信息,例如MANIFEST.MF文件;

组织:存储Spring Boot自己的类文件; Jar文件执行程序: Spring Boot Loader

我们首先从MANIFEST.MF文件中查看它

它记录应用程序的元信息,Spring的版本,应用程序的版本,Maven的版本和Main-Class。不难发现MainClass指向org.springframework.boot.loader.JarLauncher(以下称为JarLauncher),而不是我们自己的com.fxipp.spring.FirstAppByGuiApplication。

JarLauncher是名称的jar执行程序。他的类文件位于org.springframework.boot.loader目录中。可以看出,它是Spring自己的类文件。

JarLauncher的GAV org.springframework.boot: spring-boot-loader: 2.1.6.RELEASE

通常,他会将spring-boot-starter-parent引入应用程序。由于主要类指向Jar Launcher,因此我们也可以直接执行Java org。春天的框架。开机。装载机。 Jar启动器,或启动Spring项目。

现在可以执行了,它表明类JarLauncher是Spring项目的真正入口点。如果我们执行自己的com会发生什么。 fxipp。弹簧。第一个AppByGui应用程序?

启动错误报告的原因是未找到类org.springframework.boot.SpringApplication。换句话说,未指定类路径。 Spring Boot应用程序的类路径目录是BOOT-INF/lib。

也就是说,JarLauncher可以成功执行,因为Spring Book知道Class Path的路径,这表明JarLauncher在开始调用com.fxipp.spring.FirstAppByGuiApplication之前指定了Class Path的位置。

Jar Launcher的代码如下

存档。条目:是jar包中资源文件的类到对象表示。

isNestedArchive方法确定入口对象是否在jar包中。如果它在罐子里,则返回true。如果它不在jar包中,也就是说,我们解压缩了jar包,然后直接java org.springframework.boot.loader.JarLauncher启动,它将返回false。专注于launch(String)方法

此方法共有3个步骤

扩展JAR协议

JDK默认情况下支持文件,http,jar和其他协议,因此JDK内部有一个默认实现,该实现位于sun.net.软件包下。

JarFile.registerUrlProtocolHandler;此方法在org.springframework.boot.loader软件包下实现了相应的JAR协议,涵盖了原始的JAR实现。

由于最初的JAR实现,因此我们是在自己配置环境变量而不是BOOT-INF/lib时开发ClassPath的。创建一个类加载器以加载JarLauncher类,因为jar包可能未压缩,并且解压缩前后的ClassLoader是不同的。

调用启动方法以传递参数。

Args是我们自己的参数。

getMainClass用于获取MANIFEST.MF文件中的Stir-Class属性,即获取我们自定义主类的Class文件地址。

传递已启动的类加载器启动方法

启动方法分析:

将ClassLoader放在当前线程的ClassLoader中

创建一个MainMethodRunner对象并在其中调用run方法。

run方法首先获取先前设置的ClassLoader。

使用ClassLoader加载诸如Start-Class之类的类,这是我们自己的主类。

在主类中获取main方法并通过反射执行它。总结

通过分析,我们可以看到Spring Boot Loader在调用我们自己的主类之前做了三件事

扩展的JDK默认情况下支持兼容JAR的协议,因为Spring Boot不仅会启动JDK半长JAR文件,还会启动BOOT-INF/lib目录中的文件。默认实现无法将BOOT-INF/lib目录视为ClassPath,因此需要替换该实现。

确定当前媒体是java-jar启动还是java org.springframework.boot.loader.JarLauncher。为了获得相应的ClassLoader。

在MANIFEST.MF文件中获取Start-Class属性,该文件是我们的自定义主类。加载在第二步中获得的ClassLoader以获得Class文件,并通过反射调用main方法以启动应用程序。