1、运行维护
1.1、打包程序
SpringBoot程序是基于Maven创建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea环境下执行。
md-end-block
mvn package
打包后会产生一个与工程名类似的jar文件,其名称是由模块名+版本号+.jar组成的。
1.2、程序运行
程序包打好以后,就可以直接执行了。在程序包所在路径下,执行指令。
md-end-block
java -jar 工程包名.jar
执行程序打包指令后,程序正常运行,与在Idea下执行程序没有区别。
特别关注:如果你的计算机中没有安装java的jdk环境,是无法正确执行上述操作的,因为程序执行使用的是java指令。
特别关注:在使用向导创建SpringBoot工程时,pom.xml文件中会有如下配置,这一段配置千万不能删除,否则打包后无法正常执行程序。
XML
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
但是实际上会有一些其他问题,加载主引导类呀,打包时候的jdk版本呀
XML
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.songzhishu.springboot.SpringBootDemo3Application</mainClass>
<skip>false</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果在启动的时候出现端口被占用,那么怎么处理问题呐!
XML
# 查询端口
netstat -ano
# 查询指定端口
netstat -ano |findstr "端口号"
# 根据进程PID查询进程名称
tasklist |findstr "进程PID号"
# 根据PID杀死任务
taskkill /F /PID "进程PID号"
# 根据进程名称杀死任务
taskkill -f -t -im "进程名称"
2、配置高级
2.1、临时属性设置
程序打包好后,然后出现一些小问题,然后要修改配置文件,那么要重新打包程序嘛,然后修改配置文件嘛,可以在程序启动的时候可以设置临时的属性。方法也特别简单,在启动的时候添加上对应参数就可以了。
XML
java --jar springboot.jar ---server.port=80
比如修改启动的端口号!当然也可以添加其他的属性,上面的命令是启动SpringBoot程序包的命令,在命令输入完毕后,空一格,然后输入两个-号。下面按照属性名=属性值的形式添加对应参数就可以了。记得,这里的格式不是yaml中的书写格式,当属性存在多级名称时,中间使用点分隔,和properties文件中的属性格式完全相同。
如果你发现要修改的属性不止一个,可以按照上述格式继续写,属性与属性之间使用空格分隔。
XML
java --jar springboot.jar ---server.port=80 --logging.level.root=debug
2.2、属性加载优先级
关于属性的配置和修改不只是可以通过配置类,配置文件,临时修改等等,官方提供的居然有14种配置的位置,也就是说某一处的配置没有生效的话,很有可能是被其他的地方的覆盖啦
,然后你就要对照,这些可能会出现的地方进行修改!
2.3、开发环境中使用临时属性
是这样的,springboot是提供可以临时修改属性,但是万一再实际的开发中,遇到问题需要临时修改属性,但是修改后没有效果怎么办,所以再开发阶段就要考虑这个问题,我们要测试临时环境的配置是不是可以生效。
再引导类中args可以设置临时属性进行测试,当然如果不想让修改临时属性,去掉args就可以啦。
2.4、配置文件分类
SpringBoot提供了配置文件和临时属性的方式来对程序进行配置。前面一直说的是临时属性,这一节要说说配置文件了。其实这个配置文件我们一直在使用,只不过我们用的是SpringBoot提供的4级配置文件中的其中一个级别。4个级别分别是:
-
类路径下配置文件(一直使用的是这个,也就是resources目录中的application.yml文件)
-
类路径下config目录下配置文件
-
程序包所在目录中配置文件
-
程序包所在目录中config目录下配置文件
好复杂,一个一个说。其实上述4种文件是提供给你了4种配置文件书写的位置,功能都是一样的,都是做配置的。那大家关心的就是差别了,没错,就是因为位置不同,产生了差异。总体上来说,4种配置文件如果都存在的话,有一个优先级的问题,说白了就是加入4个文件我都有,里面都有一样的配置,谁生效的问题。上面4个文件的加载优先顺序为
-
file :config/application.yml 【最高】
-
file :application.yml
-
classpath:config/application.yml
-
classpath:application.yml 【最低】
3、多环境开发
什么是多环境开发,就是再不同的环境下面对应不同的配置文件。
3.1、单一的配置文件
XML
spring:
config:
activate: pro #启用pro
---
spring:
config:
activate:
on-profile: pro
server:
port: 80
---
spring:
config:
activate:
on-profile: dev
server:
port: 81
---
spring:
config:
activate:
on-profile: test
server:
port: 82
总结
-
多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
-
yaml格式中设置多环境使用---区分环境设置边界
-
每种环境的区别在于加载的配置属性不同
-
启用某种环境时需要指定启动时使用该环境
3.2、多文件的配置文件
将所有的配置都放在一个配置文件中,尤其是每一个配置应用场景都不一样,这显然不合理,于是就有了将一个配置文件拆分成多个配置文件的想法。拆分后,每个配置文件中写自己的配置,主配置文件中写清楚用哪一个配置文件就好了。
主配置文件
XML
spring:
profiles:
active: pro # 启动pro
环境配置文件
XML
server:
port: 80
环境配置文件因为每一个都是配置自己的项,所以连名字都不用写里面了。那问题是如何区分这是哪一组配置呢?使用文件名区分。
application-pro.yaml
XML
server:
port: 80
application-dev.yaml
XML
server:
port: 81
文件的命名规则为:application-环境名.yml。
在配置文件中,如果某些配置项所有环境都一样,可以将这些项写入到主配置中,只有哪些有区别的项才写入到环境配置文件中。
-
主配置文件中设置公共配置(全局)
-
环境分类配置文件中常用于设置冲突属性(局部)
总结
-
可以使用独立配置文件定义环境属性
-
独立配置文件便于线上系统维护更新并保障系统安全性
3.3、多环境开发独立配置文件书写技巧
准备工作
将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
-
application-devDB.yml
-
application-devRedis.yml
-
application-devMVC.yml
使用
使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔
XML
spring:
profiles:
active: dev
include: devDB,devRedis,devMVC
比较一下,现在相当于加载dev配置时,再加载对应的3组配置,从结构上就很清晰,用了什么,对应的名称是什么
注意
当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效
改良
但是上面的设置也有一个问题,比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次,这就比较麻烦了。SpringBoot从2.4版开始使用group属性替代include属性,降低了配置书写量。简单说就是我先写好,你爱用哪个用哪个。
XML
spring:
profiles:
active: dev
group:
"dev": devDB,devRedis,devMVC
"pro": proDB,proRedis,proMVC
"test": testDB,testRedis,testMVC
现在再来看,如果切换dev到pro,只需要改一下是不是就结束了?完美!
总结
- 多环境开发使用group属性设置配置文件分组,便于线上维护管理
3.4、多环境开发控制
多环境开发到这里基本上说完了,最后说一个冲突问题。就是maven和SpringBoot同时设置多环境的话怎么搞。
要想处理这个冲突问题,你要先理清一个关系,究竟谁在多环境开发中其主导地位。也就是说如果现在都设置了多环境,谁的应该是保留下来的,另一个应该遵从相同的设置。
maven是做什么的?项目构建管理的,最终生成代码包的,SpringBoot是干什么的?简化开发的。简化,又不是其主导作用。最终还是要靠maven来管理整个工程,所以SpringBoot应该听maven的。整个确认后下面就好做了。大体思想如下:
-
先在maven环境中设置用什么具体的环境
-
在SpringBoot中读取maven设置的环境即可
maven中设置多环境
XML
<profiles>
<profile>
<id>env_dev</id>
<properties>
<profile.active>dev</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault> <!--默认启动环境-->
</activation>
</profile>
<profile>
<id>env_pro</id>
<properties>
<profile.active>pro</profile.active>
</properties>
</profile>
</profiles>
SpringBoot中读取maven设置值
XML
spring:
profiles:
active: @profile.active@
4、日志
4.1、日志级别
日志设置好以后可以根据设置选择哪些参与记录。这里是根据日志的级别来设置的。日志的级别分为6种,分别是:
-
TRACE:运行堆栈信息,使用率低
-
DEBUG:程序员调试代码使用
-
INFO:记录运维过程数据
-
WARN:记录运维过程报警数据
-
ERROR:记录错误堆栈信息
-
FATAL:灾难信息,合并计入ERROR
一般情况下,开发时候使用DEBUG,上线后使用INFO,运维信息记录使用WARN即可。下面就设置一下日志级别。日志级别低的会被日志级别高的覆盖。
XML
logging:
# 设置日志组
group:
# 自定义组名,设置当前组中所包含的包
ebank: com.songzhishu.controller
level:
root: warn
# 为对应组设置日志级别
ebank: debug
# 为对包设置日志级别
com.songzhishu.controller: debug
基于lombok提供的@Slf4j注解为类快速添加日志对象
4.2、日志输出格式控制
日志已经能够记录了,但是目前记录的格式是SpringBoot给我们提供的,如果想自定义控制就需要自己设置了。先分析一下当前日志的记录格式。
XML
2023-11-10 12:43:06.694 #时间
INFO #日志级别
2024 #pid
---
[main] #当前线程
c.s.s.SpringBootDemo3Application: #所属的类或者接口名(简化啦)
Started SpringBootDemo3Application in 1.497 seconds (JVM running for 1.857)#日志信息
对于单条日志信息来说,日期,触发位置,记录信息是最核心的信息。级别用于做筛选过滤,PID与线程名用于做精准分析。
XML
logging:
pattern:
console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
4.3、日志文件
日志不能仅显示在控制台上,要把日志记录到文件中,方便后期维护查阅。对于日志文件的使用存在各种各样的策略,例如每日记录,分类记录,报警后记录等。这里主要研究日志文件如何记录。记录日志到文件中格式非常简单,设置日志文件名即可。
XML
logging:
logback:
rollingpolicy:
max-file-size: 3KB
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log