springBoot
一、概述
1.什么是spring boot
Spring Boot是Spring项目中的一个子工程,与我们所熟知的Spring-framework 同属于spring的产品:
其最主要作用就是帮助开发人员快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发人员关注业务而非配置。
2.spring boot的特点
1.自动配置:不需要再关注各个框架的整合配置,springboot全部都已经配置好了。
2.起步依赖:我们在需要使用某个框架的时候,直接添加这个框架的启动器依赖即可,不需要在关注jar包的冲突和整合。
3.目的
用来简化spring应用的初始搭建以及开发过程。
- 为所有spring开发提供一个更快更广泛的入门体验。
- 零配置。没有冗余代码生成和xml强制配置,遵循“约定大于配置”
- 集成了大量常用的第三方库的配置,spring boot应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。
- 提供一系列大型项目常用的非功能性,如嵌入服务器等。
4.好处
简单、快速、方便
5.优势
使用Java开发程序 , 一直困扰我们的就是臃肿、麻烦。搭建项目的过程相当复杂 , 我们需要考虑很多问题 , 主要的问题有如下两点 :
- 复杂的配置
- 混乱的依赖管理
Spring Boot帮我们解决了这个些, 我们在使用Spring Boot开发时, 不需要关注各种复杂的整合配置 , 也不用关注各个库之间的依赖及冲突问题 , Spring Boot已经默认帮我们整合配置好了 !
二、springboot之helloworld
1.需求
访问 http://localhost:8080/hello
输出 “Hello Spring Boot”
2.步骤
- 创建Maven工程
- 加依赖(springboot父工程依赖 , web启动器依赖)
1 | xml复制代码<!--spring boot 父工程依赖--> |
配置jdk版本
1 | xml复制代码<properties> |
思考: 为什么我们这里仅仅配置了这么一个变量 , 项目的JDK版本就会改变呢 ?
因为jdk插件已经在父工程中定义好了 , 默认会读取${java.version}变量值
3. 写启动引导类(springboot项目运行的入口)
1 | java复制代码import org.springframework.boot.SpringApplication; |
- 编写处理器Controller
1 | java复制代码import org.springframework.web.bind.annotation.RequestMapping; |
- 启动项目
运行启动类的main方法
3.问题
1.为什么我们在添加启动器的时候不需要在启动器的坐标中指定版本?
答案:因为我们指定了项目的父工程,在spring-boot-starter-parent中已经通过Maven的版本锁定了Jar包的版本,所以就不需要再指定了。
2.为什么我们就添加一个启动器依赖,项目就可以运行起来了,运行项目所需要的Jar包从何而来?
答案:因为我们添加了这个启动器的依赖,它已经把自己运行所需要的必要包集成在这个启动器中,通过Maven的依赖传递性,将这些包都依赖到咱们的项目里了。
4.配置文件详解
springboot支持两种类型的配置文件
- properties属性配置文件
- yaml配置文件
配置文件必须放在项目的类加载目录下, 并且名字必须是application开头
springboot项目在运行的时候会自动加载这些配置文件。
可以在spring-boot-autoconfigure-2.2.2.RELLEASE.jar的META-INF目录下找到additional-spring-configuration-metadata.json搜索server.port,显示默认的端口是8080.
为什么可以在resources下创建application.properties文件?
我们查看springboot的启动依赖
按住ctrl键点击spring-boot-starter-parent
可以在父工程中看到
1
2
3
4
5
6
7
8
9
10
11
12
13 > xml复制代码<build>
> <resources>
> <resource>
> <filtering>true</filtering>
> <directory>${basedir}/src/main/resources</directory>
> <include>**/application*.yml</include>
> <include>**/application*.yaml</include>
> <include>**/application*.properties</include>
> </resource>
> </resources>
> </build>
>
>
5.如何主动读取配置文件到类变量
要使用@Value(“${属性名}”)
如下:
在 resource
文件夹下面新建 application.properties
配置文件
1 | ini复制代码spring.jdbc.datasource.driverClassName=com.mysql.jdbc.driver |
创建类 DataSourceProperties
1 | java复制代码 |
三、YAML配置文件
1.什么是YAML?
YAML是一种配置文件格式
2.语法
1.数据结构用树形结构呈现,通过缩进来表示层级,
2.连续的项目通过减号 ” - ” 来表示
3.键值结构里面的key/value对用冒号 ” : ” 来分隔,冒号后要加上一个空格才能跟属性值。
4.YAML配置文件的扩展名是yaml 或 yml
如果要修改前面那个properties文件为yaml文件
1 | yaml复制代码spring: |
yml配置文件的特征:
- 树状层级结构展示配置项
- 配置项之间如果有关系的话需要分行,空两格
- 配置项如果有值的话,那么需要在:之后空一格再写配置项值;
yaml与peoperties配置文件处理展示像是不相同以外,其他功能和作用都是一样的。
3.多环境profile切换配置
在实际开发中,因为开发环境的变化,我们需要修改配置文件中某一个配置项的值(比如之前himysql数据库,切换成oracle数据库)
项目开发完成需要上线时,需要把一些环境改成正式环境(开发,测试,上线,多环境切换)
解决方案:使用profiles拆分配置
spring boot项目中允许使用多个yaml配置文件。
这些文件名称必须为**application-***.yml
**,并且在application.yml中激活。
具体实施
创建application-dev.yml文件如下:
1 | yaml复制代码spring: |
创建application-pro.yml
文件如下:
1 | yaml复制代码spring: |
在application.yml文件中添加如下配置:
1 | yml复制代码spring: |
此时生效的文件就是application-dev.yml配置文件。
注意:
如果properties和yml文件都存在,不存在spring.profiles.active设置,如果有重叠属性,默认以properties文件优先.
如果设置了spring.profiles.active,并且有重叠属性,以active设置优先。
可以在两种文件中分别增加server.port属性指定不同的端口,启动项目查看控制台端口号进行测试。
四、Spring Boot 的自动配置原理
1.@SpringBootApplication注解
①@SpringBootConfiguration
含义:代表这个类就是一个配置类,本质上就是一个@Configuration注解
②ComponentScan
组件扫描,默认扫描启动类所在包以及子包的类身上的注解。
③EnableAutoConfiguration
自动配置注解,添加了此注解会自动去读取spring.factories配置文件中的自动配置类。
2.@ConfigurationProperties注解
@ConfigurationProperties是SpringBoot提供的重要注解,他可以将一些配置属性批量注入到bean对象。
注入配置属性
方式一:使用@Value一个个注入
这种方式,如果属性特别多,一个一个注入非常麻烦。
方式二:使用@ConfigurationProperties批量注入【和@EnableConfigurationProperties配合使用】
1 | java复制代码@Component |
- 在类上通过@ConfigurationProperties注解声明该类要读取属性配置。
- prefix=”spring.jdbc.datasource”读取属性文件中前缀为spring.jdbc.datasource的值。前缀和属性名称和配置文件中的key必须要一致才能注入成功
- Spring Boot默认读取application.properties属性文件
开启@ConfigurationProperties注解使用
1 | java复制代码@Controller |
使用@EnableConfigurationProperties(DataSourceProperties2.class),开启DataSoutceProperties2身上的@ConfigurationProperties注解,他就会生效了,就能够帮我们注入数据了。
可能出现错误
Spring Boot Configuration Annotation Processor not found in classpath
。解决方法:
在pom文件中加入依赖
1
2
3
4
5
6
7 > xml复制代码<dependency>
> <groupId>org.springframework.boot</groupId>
> <artifactId>spring-boot-configuration-processor</artifactId>
> <optional>true</optional>
> </dependency>
>
>
3.条件化配置注解
我们看到自动配置类上有一些ConditionalXxx注解,这些注解的作用就是进行条件化选择。
所谓条件化选择就是如果满足条件,该配置类就生效,如果不满足该配置类就不生效。
常用的条件化选座注解如下:
注解 | 作用 |
---|---|
@ConditionalOnBean | 如果存在某个Bean, 配置类生效 |
@ConditionalOnMissingBean | 如果不存在某个Bean, 配置类生效 |
@ConditionalOnClass | 如果存在某个类, 配置类生效 |
@ConditionalOnMissingClass | 如果不存在某个类, 配置类生效 |
@ConditionalOnProperty | 如果存在某个属性配置, 配置类生效 |
@ConditionalOnWebApplication | 如果是一个web应用, 配置类生效 |
@ConditionalOnNotWebApplication | 如果不是一个web应用, 配置类生效 |
因为我们配置了DispatcherServlet满足上面定义的条件,所以WebMvcAutoConfiguration会生效,那么WebMvcAutoConfiguration自动配置类中帮我们配置了什么?
- 视图解析器(触发
public InternalResourceViewResolver defaultViewResolver()
或public BeanNameViewResolver beanNameViewResolver()
方法) - 处理器适配器(
public RequestMappingHandlerAdapter requestMappingHandlerAdapter()
方法)
这些配置都是我们之前在学习SpringMVC时需要自己配置的,现在Spring Boot框架都已经帮我们提前配置好了,所以我们才能使用的那么方便。
4.自动配置原理
1.加载spring.factories
在SpringApplication类构建的时候,有这样一段初始化代码:
1 | java复制代码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { |
注意 this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
点击进入getSpringFactoriesInstances
方法
1 | java复制代码 private <T> Collection<T> getSpringFactoriesInstances(Class<T> type) { |
紧接着跟入getSpringFactoriesInstances
方法
1 | java复制代码 private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) { |
可以看到Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
这条代码。能够发现loadFactoryNames()
尝试加载一些FactoryName,然后利用createSpringFactoriesInstances
将这些加载到的类名进行实例化。然后继续跟进loadFactoryNames方法:
1 | java复制代码 public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) { |
观察返回时调用的loadSpringFactories
方法
1 | java复制代码private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) { |
发现此处会利用类加载器加载一个文件:META-INF/factories。我们知道,ClassLoader默认是从classpath下读取的文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样一个文件。
我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。
2.读取自动配置类
打开这个spring.factories
1 | ini复制代码# Initializers |
可以发现以EnableAutoConfigutation接口为key的一系列配置,key所对应的值,就是所有的自动配置类,可以在当前的jar包中找到这些自动配置类:
几乎涵盖了现在主流的开源框架,我们可以从这里查看SpringMVC的自动配置类。
我们就找到了springmvc的自动配置类
3.默认属性配置
配置类找到了,那么这些默认配置的属性来自哪里?
例如:我们配置视图解析器的时候需要配置前缀后后缀,那么这些配置在哪里?
1 | java复制代码 |
通过这段源码发现,这个配置是this.mvcProperties.getView()
中获取的。查看这个方法。
1 | csharp复制代码public WebMvcProperties.View getView() { |
发现读取的是类变量
1 | arduino复制代码 private final WebMvcProperties.View view; |
这个View类型封装着前缀和后缀
1 | typescript复制代码public static class View { |
可以看到,前缀和后缀变量的值默认是null。
4.覆盖默认属性配置
如果我们想要自己指定视图的前缀和后缀?
我们可以再看WebMvcAutoConfiguration这个类的静态内部类WebMvcAutoConfigurationAdapter
上一个声明,发现这个类上面有这样一个注解@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})
。
1 | java复制代码@Configuration( |
再点进去看这两个配置类WebMvcProperties.class, 配置类身上使用ConfigurationProperties读取配置,前缀是spring.mvc
1 | java复制代码@ConfigurationProperties( |
而ResourceProperties.class读取的配置前缀是spring.resources
1 | java复制代码@ConfigurationProperties( |
所以如果我们再配置文件中配置spring.mvc前缀开头的配置,就可以将自己配置的数据注入到这个对象的属性中。注意,由于@ConfigurationProperties是批量注入,我们在写配置属性时,要和这个类的前缀+属性名完全一致,否则注入不成功。
例如
1 | yaml复制代码spring: |
或者修改端口号
1 | yaml复制代码server: |
5.自定义启动器
1.需求介绍
定义一个连接池启动器,当用户引入了连接池启动依赖之后,项目中就已经自动配置了连接池。
2.步骤分析
- 建启动器项目
- 添加启动器相关依赖
- 创建属性配置类
- 创建自动配置类
- 编写自动配置文件(spring.factories)
- 使用自定义的启动器
3.代码实现
1.创建项目,引入依赖
创建项目spring-boot-jdbc-starter
pom.xml
1 | xml复制代码<parent> |
2.创建属性配置类
1 | java复制代码import org.springframework.boot.context.properties.ConfigurationProperties; |
3.创建自动配置类
1 | java复制代码import com.alibaba.druid.pool.DruidDataSource; |
4.编写自动配置属性文件
在resources文件夹下面新建META-INF/spring.factories
1 | ini复制代码# Auto Configure |
做完之后要注意在Maven中执行install,安装项目。
5.使用自定义启动器
在新建的项目中引入我们自己的自定义启动器依赖
1 | xml复制代码<dependency> |
配置连接池信息。
新建application-datasource.yml
1 | yaml复制代码spring: |
激活配置文件application.yml
1 | yaml复制代码spring: |
进入连接池,查看连接池属性
1 | java复制代码 |
6.多种数据源
如果想让我们的启动器支持多种数据源。例如C3P0和Druid,根据配置进行选择,就可以使用条件选择进行实现。例如:如下配置中,有两个创建连接池的配置,一个是C3p0,一个是Druid,如何能够根据配置文件自动选择呢?
修改配置文件application-datasource.yml
1 | yaml复制代码spring: |
- 如果配置文件中配置了spring.jdbc.datasource.type=c3p0使用c3p0数据源
- 如果配置文件中配置了spring.jdbc.datasource.type=druid使用druid数据源。
在项目 spring-boot-jdbc-starter
, 添加创建 c3p0
方法
1 | java复制代码package com.dyy.autoconfig; |
我们可以使用条件选择实现 , 如下图所示
@ConditionalOnProperty(value = “spring.jdbc.datasource.type”,havingValue = “druid”)
install安装
spring-boot-jdbc-starter, 运行
springboot_01
修改配置文件,重新install,再次请求。
五、spring boot常用启动器
1.SpringBoot整合MVC
创建项目 springboot_02_mvc
1.依赖
1 | xml复制代码 <parent> |
2.新建入口程序类
1 | typescript复制代码package com.dyy; |
3.新建javabean
1 | java复制代码public class User { |
4.新建UserController
1 | java复制代码import com.dyy.pojo.User; |
运行程序。
2.静态资源目录
之前,开发web项目,如果是普通的项目金泰资源可以放在项目的webapp目录下。
现在使用Spring Boot做开发,项目中没有webapp目录,我们的项目是一个jar工程,那么就没有webapp,我么的静态资源该放哪里?
在springboot 中有一个叫做ResourceProperties得类,里面就定义了静态资源的默认查找路径。
1 | java复制代码@ConfigurationProperties( |
可以看到默认的静态资源路径为:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
只要静态资源放在这些目录中的任何一个,SpringMVC都会帮我们处理。我们习惯会把静态资源放在classpath:/static/目录下。在resources目录下创建index.html文件。
打开浏览器输入 : http://localhost:8080/index.html
如果想要修改默认的静态资源路径,需要在application.yml中添加
1
2
3
4
5 > javascript复制代码spring:
> resources:
> static-locations: classpath:/webapp/
>
>
重新安装启动后生效。
3.自定义的拦截器
web开发中的拦截器也是我们经常需要使用的组件,可以帮我们完成一些日志记录,数据过滤,请求过滤等等很多功能,那么在SpringBoot中该怎么配置?
在SpringMVC中配置拦截器的步骤:
- 编写一个拦截器(需要实现HandlerInterceptor接口)
- 注册拦截器(xml配置mvc:interceptors)
1 | xml复制代码ml |
因为Spring Boot没有XML配置文件了,所以在SpringBoot中使用拦截器注册的方式就不太一样了,需要借助一个WebMvcConfigurer类帮助我们注册拦截器,实现拦截器的具体步骤如下:
- 编写一个拦截器(实现HandlerInterceptor接口)
- 通过WebMvcConfigurer注册拦截器(自定义类是实现WebMvcConfigurer接口中
public void addInterceptors(InterceptorRegistry registry)
方法)
具体步骤如下
1.编写拦截器
1 | java复制代码 |
2.注册拦截器
1 | java复制代码 |
打开浏览器输入 http://localhost:8888/user/findAll
观察控制台。
4.整合Spring Data JPA
1.新建项目 springboot_jpa
2.添加Spring Data JPA的起步依赖
1 | xml复制代码 <parent> |
3.在application.yml中配置数据库和jpa的相关属性
1 | yml复制代码logging: |
注意:Mysql8.x版本,连接时url需要指定时区,并且驱动类包名发生了变化。
4.创建实体类配置属性
1 | java复制代码 |
5.编写UserRepository
1 | java复制代码import com.dyy.domain.User; |
6.编写service类
1 | java复制代码 |
7.service实现类
1 | java复制代码 |
8.编写Controller类
1 | java复制代码 |
六、SpringBoot应用
1.环境搭建
1.数据库准备
1 | sql复制代码create database springboot character set utf8 ; |
2.创建项目以及包结构
创建项目springboot_case
3.导入依赖
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
4.创建启动类
1 | java复制代码 |
2.数据访问层
1.编写配置文件application.yml
1 | yaml复制代码server: |
2.编写实体类User
1 | java复制代码 |
3.mapper接口和映射配置
1 | java复制代码 |
4.编写测试代码
1 | java复制代码@RunWith(SpringRunner.class) |
3.业务层
1.编写接口
1 | java复制代码public interface UserService { |
2.编写实现类
1 | java复制代码 |
3.编写测试代码
1 | java复制代码@RunWith(SpringRunner.class) |
注
Spring Boot整合单元测试,需要在测试类上添加两个注解:
- @RunWith(SpringRunner.class)指定Junit核心运行类
- @SpringBootTest指定这是一个Spring Boot的测试类,运行时会自动加载Spring Boot运行环境
4.表现层
1.引入依赖
1 | xml复制代码<!--Web起步依赖--> |
2.新建工具类
1 | java复制代码 |
3.编写表现层代码
1 | java复制代码@Controller |
4.代码测试
使用postman进行测试
5.页面展示
在resources
目录下创建static
目录 , 创建页面展示、list.html:
- 页面异步请求的端口和服务器端口一致
- 页面异步请求访问的路径和对应的表现层控制方法路径要致
- 页面异步请求参数名称和和对应的表现层控制方法参数一致
修改之后, 访问页面即可 : localhost:10001/list.html
6.缓存优化
1.缓存需求
问题:用户数据是不经常变化的数据,如果这些数据每次都去数据库中进行查询,效率比较低,对数据库造成很大的压力。
解决:缓存,用户第一次查询数据的时候,京数据存入到缓存中,之后再查询数据直接从缓存中获取即可,不需要再查询数据库。【此处使用redis缓存数据库存储数据】
2.依赖
1 | xml复制代码<!--springboot整合redis启动器--> |
3.编写配置文件
1 | yml复制代码spring: |
4.修改业务层实现类代码
1 | java复制代码 |
七、SpringBoot其他组件
1.SpringBoot Actuator组件
作用
Spring Boot Actuator是SpringBoot自带的一个组件 , 可以帮助我们监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。
如何使用
1.引入SpringBoot Actuator起步依赖
1 | xml复制代码<dependency> |
2.配置SpringBoot Actuator参数
1 | yml复制代码management: |
3.启动项目获取系统信息
目启动之后就可以通过发送http请求获取系统健康数据了 , 例如 : http://localhost:9999/monitor/health
, 返回数据如下 :
1 | json复制代码{ |
常用的访问路径
HTTP 方法 | 路径 | 描述 |
---|---|---|
GET | /autoconfig | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
GET | /configprops | 描述配置属性(包含默认值)如何注入Bean |
GET | /beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
GET | /dump | 获取线程活动的快照 |
GET | /env | 获取全部环境属性 |
GET | /env/{name} | 根据名称获取特定的环境属性值 |
GET | /health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
GET | /info | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
GET | /mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
GET | /metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
GET | /metrics/{name} | 报告指定名称的应用程序度量值 |
POST | /shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true |
GET | /trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
我们可以通过发送这些请求,获取系统状态信息。
2.SpringBoot Admin组件
上面我们讲了Spring Boot Actuator
, 可以通过http协议获取系统状态信息 , 但是返回的是JSON格式数据, 看起来不太方面, 而且还需要记忆路径, 比较麻烦 , Spring Boot Admin
给我们提供了更加友好的可视化界面来查看这些信息 !
Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client
向Spring Boot Admin Server
注册 , Client
会定时向Server
发送数据, Server
使用友好的界面展示数据。
1.SpringBoot Admin服务端
1.创建项目springboot-admin-server
2.依赖
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
3.配置application.yml
1 | yml复制代码spring: |
我们将Spring Boot Admin端口号设置为8769.
4.启动类
1 | java复制代码@SpringBootApplication |
@EnableAdminServer的作用是开启管理服务。
2.SpringBoot Admin客户端
1.创建springboot-admin-client
2.依赖
1 | xml复制代码<dependency> |
3.配置
向admin-server注册的地址为http://localhost:8769,最后暴漏自己的actuator所有的端口信息,具体配置如下:
1 | yml复制代码server: |
这个注册的地址一定要和SpringBoot Admin Server地址匹配。
4.启动测试
分别开启客户端(应用程序)和服务端,访问http://localhost:8769,可以看到这样一个界面。
八、Spring Boot项目打包部署
1.项目打包
1.在pom中配置Spring Boot 项目的maven插件
1 | xml复制代码<build> |
2.运行maven的打包命令
3.打包之前我们需要跳过测试
如果不跳过测试,那么我们编写的测试类都会被maven自动执行,可能会出现错误,导致打包不成功。
4.执行之后可以在控制台看到打包的日志信息,其中有生成的包的位置
打开指定目录就可以发现有一个jar包存在 , 仔细观察其实我们会发现 , 在target目录下其实会存在二个jar包 , 一个是springboot_02-1.0-SNAPSHOT.jar
一个是springboot_02-1.0-SNAPSHOT.jar.original
, 那么这两个jar包有什么区别呢?
我们如果是普通项目打包那么就只会得到一个jar包 , 这个jar包中不包含项目的一些依赖jar包
但是我们现在是一个Spring Boot项目 , 我们希望打完的包能够直接运行, 所以项目中就必须包含他的依赖jar包 , 我们之前在pom.xml
中配置一个Spring Boot的maven插件可以在普通包的基础上将我们项目的一些运行及依赖信息打进jar包里面 , 打完包之后将原来的普通包改名为xxx.jar.original
, 新打的包为xxx.jar
.
也就是说
.jar.original
是普通jar包,不包含依赖.jar
是可执行jar包,包含了pom中的所有依赖,可以直接用java -jar
命令执行- 如果是部署,就用
.jar
, 如果是给别的项目用,就要给.jar.original
这个包
2.项目运行
打开命令行运行打出来的包:使用命令:java -jar包全名
1 | 复制代码java -jar springboot_02-1.0-SNAPSHOT.jar |
本文转载自: 掘金