概述 ---- 在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来。但是运行的方式是在IDEA中直接Run起来的。...还有另一中方式可以可以把Spring Boot程序运行起来,就是直接在命令行中执行jar包。...---- 打成jar包 ---- 以往的WEB程序需要打成WAR包,部署到Tomcat上,而Spring Boot支持打包成JAR的形式,就算是JAR里面包含图片、页面等,也是支持的。...执行成功后可以在工程目录中的target目录下找到对应的JAR包。...Boot 具体的代码请参看之前的Spring Boot 开篇-创建和运行 。
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 能独立运行的jar文件 在开发springboot应用时...: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.3.1.RELEASE...命令时JarLauncher类会被执行,但实际上是SpringbootstarterdemoApplication被执行了,这其中发生了什么呢?.../spring-projects/spring-boot/releases/tag/v2.3.1.RELEASE JarLauncher所在的工程是spring-boot-loader,先弄明白JarLauncher...中: protected void launch(String[] args) throws Exception { // 将jar解压后运行的方式叫做exploded mode //
SNAPSHOT.jar是前面的springboot工程的构建结果,是个压缩包,用常见的压缩工具就能解压,我这里的环境是MacBook Pro,用unzip即可解压; 解压后有很多内容,我们先关注manifest...: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.3.1.RELEASE...命令时JarLauncher类会被执行,但实际上是SpringbootstarterdemoApplication被执行了,这其中发生了什么呢?.../spring-projects/spring-boot/releases/tag/v2.3.1.RELEASE JarLauncher所在的工程是spring-boot-loader,先弄明白JarLauncher...void launch(String[] args) throws Exception { // 将jar解压后运行的方式叫做exploded mode // 如果是exploded
每天早上七点三十,准时推送干货 大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。...认识 jar 在介绍 java -jar 运行原理之前我们先看一下 jar 包里面都包含了哪些内容,我们准备一个 SpringBoot 项目,通过在 https://start.spring.io/ 上我们可以快速创建一个...下载后的项目我们在 pom 依赖里面可以看到有如下依赖,这个插件是我们构建可执行 jar 的前提,所以如果想要打包成一个 jar 那必须在 pom 有增加这个插件,从 start.spring.io 上创建的项目默认是会带上这个插件的...由此我们先大胆的猜测一下,当我们在执行 java -jar 的时候,由于我们的 jar 里面存在 MANIFEST.MF 文件,并且其中包含了 Main-Class 属性且配置了 org.springframework.boot.loader.JarLauncher...因为 JarLauncher 类是在 spring-boot-loader 模块,所以我们在 pom 文件中增加如下依赖,就可以下载源码进行跟踪了。
在查询结果找到spring下的项目 ? 确定JarLauncher位于spring-boot-loader下。...为了方便查看源码,在pom中引入 org.springframework.boot spring-boot-loader...-jar 命令时,将调用main方法,实际上调用的是 JarLauncher#launch方法,该方法继承与org.springframework.boot.loader.Launcher...Boot生成的FAT jar,在被java -jar 引导时,其内部的jar文件无法被处理。...解压的jar,查看也与只对应 ?
指令,看到整个解压之后的 FatJar 的目录结构如下(部分省略): 简单来看,FatJar 解压之后包括三个文件夹: 我们平时在 debug SpringBoot 工程的启动流程时,一般都是从 SpringApplication...spring-boot-maven-plugin 打包 spring-boot-loader 过程 因为在新建的空的 SpringBoot 工程中并没有任何地方显示的引入或者编写相关的类。...而 java 指令在启动时也没有指定 class path 。...那这里基本可以猜到,JarLauncher 方式启动时,一定会通过某种方式将所需要依赖的 JAR 文件作为 BootStrap 的依赖引入进来。...下面就来简单分析下 JarLauncher 启动时,作为启动引导类,它做了哪些事情。
Spring boot 的FAT Jar是一个独立的归档文件,除了包含传统的 Java Jar资源外,还有依赖的JAR文件, 被java -jar 引导时,内部依赖的JAR 文件无法被JDK内建的jar...也就是JarLauncher 和 WarLauncher 本质上 无差别,建议 Spring boot应用使用非传统Web部署时,尽可能使用JAR归档的方式。...,在启动的时候在解压到webapps目录下面;Spring Boot 2.0 的实现,利用嵌入式Tomcat API构建 为 TomcatWebServer Bean,由Sping应用上下文将其引导,...总结:传统的Servlet容器是将压缩的WAR文件解压到对应的目录,然后在加载该目录的资源。 Spring Boot 可执行的 WAR文件在不解压当前文件的前提下依然可以读取其中的资源。...在使用Springboot的时候,当我们将 “starter”添加到应用Class path 时,其关联的特性随应用启动而自动装载,这是Spring boot的亮点, 它的原理是什么呢?
in jar的URL时,spring boot会循环处理,并缓存已经加载到的JarFile 对于多重jar in jar,实际上是解压到了临时目录来处理,可以参考JarFileArchive里的代码 在获取...还有一种情况是在一个开放目录下启动Spring boot启动。所谓的开放目录就是把fat jar解压,然后直接启动应用。...(前面在jar里时是JarFileArchive),后面的启动流程类似fat jar的。...Embead Tomcat的启动流程 判断是否在web环境 spring boot在启动时,先通过一个简单的查找Servlet类的方式来判断是不是在web环境: private static final...的一些缺点: 当spring boot应用以一个fat jar方式运行时,会遇到一些问题。
使用-jar参数时,后面的参数是的jar 【spring-0.0.1-SNAPSHOT.jar】,该jar文件中包含的是class和资源文件; 在manifest文件中有Main-Class的定义;Main-Class...所以问题就来了:理论上看,执行java -jar命令时JarLauncher类会被执行,但实际上是com.artisan.spring.Application被执行了,这其中发生了什么呢?why?...前者用于在文件夹目录下寻找资源,后者用于在jar包环境下寻找资源。...在创建JarLauncher时,父类ExecutableArchiveLauncher找到自己所在的jar,并创建archive。...通过spring-boot-plugin 生成了MANIFEST.MF , main-class 指定运行java -jar的主程序把依赖的jar文件 打包在fat jar. ?
) { // 加载配置文件,然后再运行↓将Spring Boot跑起来 runApplication(*args) } 实现 思路有了之后就简单了,一波操作...在Idea里运行没问题,跑起来了,但是,当打包成jar包之后就行不通了,会爆异常 Caused by: java.nio.file.FileSystemNotFoundException...,实际上也不会很麻烦,解压在CI构建阶段完成即可。不过要完成项目的启动,必须先找到Spring Boot的启动类。...打开jar包,查看里面的META-INF/MENIFEST.MF文件,可以看到Main-Class是org.springframework.boot.loader.JarLauncher ?...那么我们的启动命令将改成这样就大功告成 java -cp /解压出来的文件夹根目录 org.springframework.boot.loader.JarLauncher redis 127.0.0.1
当Spring Boot应用程序启动时,Spring框架会扫描所有的spring.factories文件,然后根据其中配置的自动配置类,自动应用相应的配置。...1.可运行jar的目录结构 SrpingBoot运行的时候是直接运行的一个jar文件,那么java -jar做了什么事情呢,我们先从项目目录结构分析一下。...通过unzip命令解压jar文件,基本可以得到大致如下的目录结构: spring-boot-demo ├── META-INF │ └── MANIFEST.MF ├── BOOT-INF...用以加载SpringBoot中的jar,在MANIFEST.MF中的Main-Class中有指定JarLauncher: Manifest-Version: 1.0 Spring-Boot-Classpath-Index...,在执行java -jar时就会调用JarLauncher中执行main方法,所有应用程序类文件均可通过/BOOT-INF/classes加载,所有依赖的第三方jar均可通过/BOOT-INF/lib加载
,返回值是一个具体的文件路径,原因也很简单,因为Tomcat在启动一个webapp时会将对应的war解压,然后针对解压后的路径使用一个单独的类加载器进行加载。..." } 打包成fat jar fat jar是Spring Boot引入的一种新格式,其打包后的结构与war包比较类似,但是可以直接执行并不需要先解压再加载,打包后类似目录如下: BOOT-INF/classes...Spring Boot启动原理 打开Spring Boot最终产出的jar包,其MANIFEST.MF文件表明项目的启动入口为org.springframework.boot.loader.JarLauncher...,该类在spring-boot-loader模块下,运行时由Spring Boot所提供,因此可以通过maven引入provided类型的依赖从而查看到源码。...文章标题: Spring Boot -- 如何获取已加载的JAR文件流 文章链接: https://mrdear.cn/2019/03/19/framework/spring/在jar中获取jar文件流
spring boot 的工程支持打包为jar和war,打包成 jar 或 war 可以直接用 java -jar xxx.jar 来启动,war包也可以放入tomcat等容器中运行。...在spring boot项目中,spring boot 提供 为 maven 和 gradle 分别提供了插件增加 repackage 的goal,用于打出 executable 的 fat jar,这个...jar包除了包含了我们的项目编译后的代码和所需的依赖包以外,还有spring-boot-loader 的一些类用于提供类加载器和启动我们自己的main方法,内嵌的依赖jar不需要解压缩和将所有的类都读入内存...Jar Plugin 3.2.0 Main-Class: org.springframework.boot.loader.JarLauncher Main-Class 是 spring 的org.springframework.boot.loader.JarLauncher...:这个文件记录了我们的依赖包的路径,但是这个配置,只有在以展开后的运行方式中才会使用。
要想调试springboot加载方式,不能直接在idea中运行主程序,要使用真实场景下的java -jar方式运行,需要做两件事: 1、需要打包springboot应用程序 2、在IDEA中用java...-jar springboot.jar来运行才能debug springboot使用maven plugin打包成可运行的jar文件 org.springframework.boot... spring-boot-maven-plugin SpringBoot打出的jar包,可以直接通过解压的方式查看内部的构造...: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.2.1.RELEASE...当依赖jar包中有与工程目录下有同路径同名资源文件时,为了不必要的冲突,在classloader#getResource时,不要使用绝对路径。
准备 Spring Boot 项目的可运行 JAR 包。...确认项目已打包为 JAR 文件: 执行以下命令打包 Spring Boot 项目: mvn clean package 在 target 目录下找到生成的 JAR 文件(如 myapp.jar)。...Application运行 注意事项 JAR 包格式: 默认 Spring Boot JAR 包是嵌套结构,主类应该指定为 org.springframework.boot.loader.JarLauncher...如果需要主类直接加载,需要解压并重新打包 JAR,将 BOOT-INF/classes 的内容移到根目录,并将依赖放在类路径中。...双击 EXE 文件,验证是否能正常运行。 在命令行中运行 EXE 文件,检查是否有错误日志输出。
简介 在很久很久以前,我们是怎么创建Spring Boot的docker image呢?...最最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个docker file,将这个fat jar制作成为一个docker image然后运行。...第三部分是Spring Boot的类加载器,fat jar包的启动是通过Spring Boot的jarLauncher来创建LaunchedURLClassLoader,通过它来加载lib下面的jar包...第一个问题:我们是用的far jar,在使用far jar的过程中会有一定的性能问题,肯定要比解压过后的性能要低,尤其是在容器环境中运行的情况下,可能会更加突出。...在Maven和Gradle中,Spring Boot引入了新的phase:spring-boot:build-image 我们可以直接运行: mvn spring-boot:build-image
Launcher实现原理 在上节内容中,我们得知 jar 包 Main-Class 指定入口程序为 Spring Boot 提供的 L auncher(JarL auncher),并不是我们在 Spring...,而 jar 内部的 jar 文件依旧会被 Spring Boot认为是一个 Archive。...通常,jar 里的资源分隔符是!/,在 JDK 提供的 JarFile URL 只支持一层“!"”,而 Spring Boot扩展了该协议,可支持多层"!/”。...因此,在 Spring Boot 中也就可以表示 jar in jar、jar indirectory、fat jar 类型的资源了。...构 建 L auncherURLClassLoader 时 搜 索 BOOT-INF/classes 目 录 及BOOT-INF/lib 目 录 下 的 jar 。
Spring Boot 提供了一个插件 spring-boot-maven-plugin 用于把程序打包成一个可执行的jar包。...-1.0.jar │ ├── classmate-1.1.0.jar │ ├── spring-boot-1.3.5.RELEASE.jar │ ├── spring-boot-autoconfigure...jar executable-jar-1.0-SNAPSHOT.jar 运行 Spring Boot 应用的几种方式看这篇:运行 Spring Boot 应用的3种方式。...args) { try { // 在系统属性中设置注册了自定义的URL处理器:org.springframework.boot.loader.jar.Handler。..."); Spring Boot Loader的作用 Spring Boot 在可执行jar包中定义了自己的一套规则,比如第三方依赖jar包在/lib目录下,jar包的URL路径使用自定义的规则并且这个规则需要使用
:my-lib.jar yjmyzz.runnable.jar.DemoApp 程序就能跑起来了 方法二:借助manifest文件 想办法在my-jar.jar中添加MANIFEST.MF文件,内容参考下面这样...,如果是maven项目,请参考 maven: 打包可运行的jar包(java application)及依赖项处理 一文 方法三:借助spring-boot 插件 前面二种方法,主程序的jar包,与依赖的...jar包是分开的,这在云环境中,上传部署比较麻烦,得传多个文件(或者上传前,先压缩成一个包,再传到服务器上解压),服务器节点多时,操作起来太累。...文件),其原理在于spring-boot插件把所有依赖的jar包,全都打到一个jar包里了。...,此外还增加了Start-Class指向我们真正的程序入口yjmyzz.runnable.jar.DemoApp,换句话说,程序运行时,先调用org.springframework.boot.loader.JarLauncher
-jar archive.jar 运行包含嵌套依赖 jar 的 jar 或者 war 文件。...spring-boot-autoconfigure 模块 Spring的出现给我们管理 Bean 的依赖注入提供了便捷,但是当我们需要使用通过 pom 引入的 jar 里面的一个 Bean 时候,还是需要手动在...spring-boot-loader 模块则允许我们使用 java -jar archive.jar 方式运行包含嵌套依赖 jar 的 jar 或者 war 文件,它提供了三种类启动器(JarLauncher...首先在打包时候会使用 spring-boot-maven-plugin 插件重写打成的 jar 文件,会设置META-INF/MANIFEST.MF 中的 Main-Class:org.springframework.boot.loader.JarLauncher...接着,运行 java -jar archive.jar ,Launcher 会加载 JarLauncher 类并执行其中的 main 函数,JarLauncher 主要关心构造一个合适的 URLClassLoader
领取专属 10元无门槛券
手把手带您无忧上云