springboot命令java -jar执行流程

 更新时间:2025年08月11日 11:09:18   作者:夜之雨  
Spring Boot打包使用Maven生成jar,包含配置文件、类文件及MANIFEST.MF,启动时通过JarLauncher加载,扫描类路径,设置自定义类加载器,反射执行主类,本文给大家介绍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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot实现FastJson解析json数据的方法

    springboot实现FastJson解析json数据的方法

    本篇文章主要介绍了springboot实现FastJson解析json数据的方法,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • Java多线程编程实战之模拟大量数据同步

    Java多线程编程实战之模拟大量数据同步

    这篇文章主要介绍了Java多线程编程实战之模拟大量数据同步,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • SpringBatch数据写入实现

    SpringBatch数据写入实现

    Spring Batch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Java如何通过枚举实现有限状态机

    Java如何通过枚举实现有限状态机

    这篇文章主要介绍了Java如何通过枚举实现有限状态机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    这篇文章主要介绍了es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • javaFX实现五子棋小游戏

    javaFX实现五子棋小游戏

    这篇文章主要为大家详细介绍了javaFX实现五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • mybatis Interceptor对UpdateTime自动处理的实现方法

    mybatis Interceptor对UpdateTime自动处理的实现方法

    这篇文章主要给大家介绍了关于使用mybatis Interceptor对UpdateTime自动处理的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • 分享Spring Cloud OpenFeign 的五个优化技巧

    分享Spring Cloud OpenFeign 的五个优化技巧

    这篇文章主要分享的是Spring Cloud OpenFeign 的五个优化技巧,OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件,更多相关内容需要的小伙伴可以参考一下
    2022-05-05
  • Java报错:找不到或无法加载主类的解决办法

    Java报错:找不到或无法加载主类的解决办法

    在Java中当您尝试运行一个类作为主类时,如果系统找不到该类或者无法加载该类,就会出现"找不到或无法加载主类"的错误,这篇文章主要给大家介绍了关于Java报错:找不到或无法加载主类的解决办法,需要的朋友可以参考下
    2024-12-12
  • Java Swing实现记事本页面

    Java Swing实现记事本页面

    这篇文章主要为大家详细介绍了Java Swing实现记事本页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论