springboot命令java -jar执行流程
作者:夜之雨
一 打包
1.1 命令
mvn clean package
使用命令打包,jar文件路径:target/*.jar
1.2 包结构
spring-0.0.1-SNAPSHOT.jar
├── META-INF
│ └── maven(主要是pom文件)
│ └── MANIFEST.MF
├── BOOT-INF
│ ├── classes
│ │ └── 应用程序类
│ └── lib
│ └── 第三方依赖jar
└── org
└── springframework
└── boot
└── loader
└── springboot启动程序application.yml
com/
META/INF/
*.properties
application.yml:应用配置参数信息
com文件夹:编译后的class文件
MANIFEST.MF 清单文件
MANIFEST.MF:应用jar打包信息
org:来自spring-boot-loader(用于项目的打包和加载)jar包编译之后的内容
start-Class: com.meishi.sales.SalesBootstrap springboot 提供的类加载器 也就是@springBootAplication注解标示的类
Main-Class: org.springframework.boot.loader.JarLauncher 程序启动入口类
二 执行流程
2.1 依赖
<!-- spring-boot-loader-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
<scope>provided</scope>
</dependency>2.2 JarLauncher
JarLauncher 程序启动入口类 将其对应jar加载到内存中 类路径下
public class JarLauncher extends ExecutableArchiveLauncher {
static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
static final String BOOT_INF_LIB = "BOOT-INF/lib/";
//在父类方法中创建了归档文件
public JarLauncher() {
}
protected JarLauncher(Archive archive) {
super(archive);
}
@Override
protected boolean isNestedArchive(Archive.Entry entry) {
//如果是一个目录
if (entry.isDirectory()) {
//如果返回的目录名字 != "BOOT-INF/classes/"
return entry.getName().equals(BOOT_INF_CLASSES);
}
//如果是一个文件 是不是以"BOOT-INF/lib/" 开头
return entry.getName().startsWith(BOOT_INF_LIB);
}
public static void main(String[] args) throws Exception {
//先通过无参构造判断是否为jar再创建归档文件archive再调用父类launcher的launch方法
new JarLauncher().launch(args);
}
}2.3 总结
1、spring jar包启动时springboot会扫描配置清单的Main-Class指定的类执行其springboot-loader这个启动包的JarLauncher的main方法
2、去扫描 boot-inf 中的classes包和lib包 存储到List集合当中。
3、将自定义的加载类LaunchedURLClassLoaderset到上下文去加载对应class 到jvm当中4、在通过start-Class指定的springbootAppliction类获取到当前springboot的 启动类 5、通过反射获取到main的这个方法然后invoke启动
到此这篇关于springboot命令java -jar执行流程的文章就介绍到这了,更多相关springboot java -jar内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
