spring boot 怎么启动

 我来答
宝贝爱妳day
2018-07-05 · 知道合伙人软件行家
宝贝爱妳day
知道合伙人软件行家
采纳数:227 获赞数:229
获得计算机应用基础证书考试 获得全国计算机信息高新技术考试合格证书

向TA提问 私信TA
展开全部
Spring Boot 是 Spring 产品中一个新的子项目,致力于简便快捷地搭建基于 Spring 的独立可运行的应用。大多数的 Spring Boot 应用只需要非常少的 Spring 配置。
你能够使用 Spring Boot 创建 Java 应用并通过 java -jar 来运行或者创建传统的通过 war 来部署的应用。Spring Boot 也提供了一个命令行工具来运行 spring 脚本。
Spring Boot 的目标是:
快速开发基于 Spring 的应用
开箱即用的微服务
提供一些大型项目常用的非功能性特性,例如:嵌入式服务、安全、监控、健康检查、外部配置
不用生成代码,没有 xml 配置
通畅又开心的小白桦4857
2020-12-30
知道答主
回答量:60
采纳率:75%
帮助的人:1.8万
展开全部
一:IDE 运行Application这个类的main方法
二:在springboot的应用的根目录下运行mvn spring-boot:run
三:使用mvn install 生成jar后运行
先到项目根目录
mvn install
cd target
java -jar xxxx.jar
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lilipat
高粉答主

2017-11-01 · 每个回答都超有意思的
知道大有可为答主
回答量:3万
采纳率:94%
帮助的人:4884万
展开全部

spring boot应用启动原理分析

    spring boot quick start

    在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server。

    如果之前没有使用过spring boot可以通过下面的demo来感受下。 
    下面以这个工程为例,演示如何启动Spring boot项目:

  • git clone git@github.com:hengyunabc/spring-boot-demo.git

  • mvn spring-boot-demo

  • java -jar target/demo-0.0.1-SNAPSHOT.jar123

  • 如果使用的IDE是spring sts或者idea,可以通过向导来创建spring boot项目。

    也可以参考官方教程: 
    http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-first-application

    对spring boot的两个疑问

    刚开始接触spring boot时,通常会有这些疑问

  • spring boot如何启动的?

  • spring boot embed tomcat是如何工作的? 静态文件,jsp,网页模板这些是如何加载到的?

  • 下面来分析spring boot是如何做到的。

    打包为单个jar时,spring boot的启动方式

    maven打包之后,会生成两个jar文件:

  • demo-0.0.1-SNAPSHOT.jardemo-0.0.1-SNAPSHOT.jar.original12

  • 其中demo-0.0.1-SNAPSHOT.jar.original是默认的maven-jar-plugin生成的包。

    demo-0.0.1-SNAPSHOT.jar是spring boot maven插件生成的jar包,里面包含了应用的依赖,以及spring boot相关的类。下面称之为fat jar。

    先来查看spring boot打好的包的目录结构(不重要的省略掉):

  • ├── META-INF

  • │   ├── MANIFEST.MF

  • ├── application.properties

  • ├── com

  • │   └── example

  • │       └── SpringBootDemoApplication.class

  • ├── lib

  • │   ├── aopalliance-1.0.jar

  • │   ├── spring-beans-4.2.3.RELEASE.jar

  • │   ├── ...└── org

  •    └── springframework

  •        └── boot

  •            └── loader

  •                ├── ExecutableArchiveLauncher.class

  •                ├── JarLauncher.class

  •                ├── JavaAgentDetector.class

  •                ├── LaunchedURLClassLoader.class

  •                ├── Launcher.class

  •                ├── MainMethodRunner.class

  •                ├── ...                123456789101112131415161718192021

  • 依次来看下这些内容。

    MANIFEST.MF

  • Manifest-Version: 1.0Start-Class: com.example.SpringBootDemoApplicationImplementation-Vendor-Id: com.exampleSpring-Boot-Version: 1.3.0.RELEASECreated-By: Apache Maven 3.3.3Build-Jdk: 1.8.0_60Implementation-Vendor: Pivotal Software, Inc.Main-Class: org.springframework.boot.loader.JarLauncher12345678

  • 可以看到有Main-Class是org.springframework.boot.loader.JarLauncher ,这个是jar启动的Main函数。

    还有一个Start-Class是com.example.SpringBootDemoApplication,这个是我们应用自己的Main函数。

  • @SpringBootApplicationpublic class SpringBootDemoApplication {


  •    public static void main(String[] args) {

  •        SpringApplication.run(SpringBootDemoApplication.class, args);

  •    }

  • }1234567

  • com/example 目录

    这下面放的是应用的.class文件。

    lib目录

    这里存放的是应用的Maven依赖的jar包文件。 
    比如spring-beans,spring-mvc等jar。

    org/springframework/boot/loader 目录

    这下面存放的是Spring boot loader的.class文件。

    Archive的概念

  • archive即归档文件,这个概念在linux下比较常见

  • 通常就是一个tar/zip格式的压缩包

  • jar是zip格式

  • 在spring boot里,抽象出了Archive的概念。

    一个archive可以是一个jar(JarFileArchive),也可以是一个文件目录(ExplodedArchive)。可以理解为Spring boot抽象出来的统一访问资源的层。

    上面的demo-0.0.1-SNAPSHOT.jar 是一个Archive,然后demo-0.0.1-SNAPSHOT.jar里的/lib目录下面的每一个Jar包,也是一个Archive。

  • public abstract class Archive {

  •    public abstract URL getUrl();    public String getMainClass();    public abstract Collection<Entry> getEntries();    public abstract List<Archive> getNestedArchives(EntryFilter filter);12345

  • 可以看到Archive有一个自己的URL,比如:

  • jar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/1

  • 还有一个getNestedArchives函数,这个实际返回的是demo-0.0.1-SNAPSHOT.jar/lib下面的jar的Archive列表。它们的URL是:

  • jar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/lib/aopalliance-1.0.jarjar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/lib/spring-beans-4.2.3.RELEASE.jar12

  • JarLauncher

    从MANIFEST.MF可以看到Main函数是JarLauncher,下面来分析它的工作流程。

    JarLauncher类的继承结构是:

  • class JarLauncher extends ExecutableArchiveLauncher

  • class ExecutableArchiveLauncher extends Launcher12

  • 以demo-0.0.1-SNAPSHOT.jar创建一个Archive:

    JarLauncher先找到自己所在的jar,即demo-0.0.1-SNAPSHOT.jar的路径,然后创建了一个Archive。

    结合Archive提供的getEntries函数,就可以获取到Archive里的Resource。当然里面的细节还是很多的,下面再描述。

    spring boot应用启动流程总结

    看到这里,可以总结下Spring Boot应用的启动流程:

  • spring boot应用打包之后,生成一个fat jar,里面包含了应用依赖的jar包,还有Spring boot loader相关的类

  • Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载/lib下面的jar,并以一个新线程启动应用的Main函数。

  • spring boot loader里的细节

    代码地址:https://github.com/spring-projects/spring-boot/tree/master/spring-boot-tools/spring-boot-loader

    JarFile URL的扩展

    Spring boot能做到以一个fat jar来启动,最重要的一点是它实现了jar in jar的加载方式。

    JDK原始的JarFile URL的定义可以参考这里:

    http://docs.oracle.com/javase/7/docs/api/java/net/JarURLConnection.html

    原始的JarFile URL是这样子的:

  • jar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/1

  • jar包里的资源的URL:

  • jar:file:/tmp/target/demo-0.0.1-SNAPSHOT.jar!/com/example/SpringBootDemoApplication.class1
  • 从一个URL,到最终读取到URL里的内容,整个过程是比较复杂的,总结下:

  • spring boot注册了一个Handler来处理”jar:”这种协议的URL

  • spring boot扩展了JarFile和JarURLConnection,内部处理jar in jar的情况

  • 在处理多重jar in jar的URL时,spring boot会循环处理,并缓存已经加载到的JarFile

  • 对于多重jar in jar,实际上是解压到了临时目录来处理,可以参考JarFileArchive里的代码

  • 在获取URL的InputStream时,最终获取到的是JarFile里的JarEntryData

  • 这里面的细节很多,只列出比较重要的一些点。

    然后,URLClassLoader是如何getResource的呢?

    URLClassLoader在构造时,有URL[]数组参数,它内部会用这个数组来构造一个URLClassPath:

  • URLClassPath ucp = new URLClassPath(urls);1

  • 在 URLClassPath 内部会为这些URLS 都构造一个Loader,然后在getResource时,会从这些Loader里一个个去尝试获取。 
    如果获取成功的话,就像下面那样包装为一个Resource。

  • spring boot应用喜欢把配置都写到代码里,有时会带来混乱。一些简单可以用xml来表达的配置可能会变得难读,而且凌乱。

  • 总结

    spring boot通过扩展了jar协议,抽象出Archive概念,和配套的JarFile,JarUrlConnection,LaunchedURLClassLoader,从而实现了上层应用无感知的all in one的开发体验。尽管Executable war并不是spring提出的概念,但spring boot让它发扬光大。

    spring boot是一个惊人的项目,可以说是spring的第二春,spring-cloud-config, spring-session, metrics, remote shell等都是深爱开发者喜爱的项目、特性。几乎可以肯定设计者是有丰富的一线开发经验,深知开发人员的痛点。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式