文章目录
- 1. SpringBoot 项目部署
- 2. 属性配置方式
- 2.1 通过 cmd 命令行配置
- 2.2 通过环境变量配置
- 2.3 通过外部配置文件来配置
- 3. 多环境开发 Profiles
- 3.1 多环境开发的单文件配置
- 3.2 多环境开发的多文件配置
- 3.3 多环境开发-分组
1. SpringBoot 项目部署
项目完成后,需要部署到服务器上。
SpringBoot 项目需要经过编译打包生成一个 jar 包(借助打包插件 spring-boot-maven-plugin),再将该 jar 包发送或拷贝到服务器上,然后就可以通过执行 java -jar jar包位置
来运行 jar 包。
服务器的系统可能是 windows、mac、linux。
(1) 在 pom.xml 中导入打包插件
<build>
<plugins>
<plugin>
<!--打包插件: 版本与boot版本保持一致-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.1.5</version>
</plugin>
</plugins>
</build>
(2) 将项目打包,双击 package
项目会经过编译、测试,最终打包完成:
打包完成后得到的 jar 包:
在本地磁盘目录下打开 jar 包所在位置:
现在按说要将该 jar 包发送到服务器,再执行 java -jar 命令。这里就不再发送到服务器了,直接把本机当成服务器运行 jar 包(此前要停止 idea 中的项目占用默认的 8080 端口)
此时,项目就部署好了,postman 测试正常。
2. 属性配置方式
如果希望部署好的项目绑定的端口是 9090,而不是默认的 8080,该怎么办呢?
根据之前的知识,可以在 properties 或 yml 配置文件中通过 server.port 来配置。
但是我们交给客户或运维的是 jar 包,而不是项目源文件,所以他们无法直接修改这些属性。那怎么办呢?此时就要用到 SpringBoot 属性配置相关知识了。
之前我们配置属性的方式是在 yml 配置文件中,除此之外,SpringBoot 还提供了其他配置属性的方式,下面以 windows 服务器为例来介绍。
2.1 通过 cmd 命令行配置
在运行 java -jar 命令时添加参数,以指定端口。该参数会被传递到启动类 main 方法的形参上(args 数组),项目启动后,该参数又被传递给 run 方法。
2.2 通过环境变量配置
在环境变量中添加属性,键和值需要与 SpringBoot 中需要的键和值保持一致,将来 Boot 程序会自动读取这些环境变量来使用。
重新打开 cmd,运行 jar 包,可以发现在环境变量中的修改已经生效
当需要配置的属性很多时,以上两种方式都比较繁琐。因此,SpringBoot 又提供了外部配置文件的方式来配置属性。
2.3 通过外部配置文件来配置
在 jar 包所在目录下,提供 application.yml 配置文件。可以在该文件中批量配置要修改的属性。jar 包运行起来之后,Springboot 会自动读取该文件中的配置来使用。
在测试该方法是否生效之前,删掉之前在环境变量中配置的端口号:
重新启动 cmd,端口号发生改变:
到此为止,我们已经学习了四种属性配置方式,它们的优先级如下(命令行参数优先级最高):
3. 多环境开发 Profiles
多环境指的是我们的程序将来可能运行在不同的环境中,如:开发、测试、生产环境。
在不同环境下,程序的配置信息有可能不同。举个例子:在开发、测试、生产环境中,程序连接的数据库是不同的,因此配置文件中书写的有关数据库的配置信息也会不同。为了使程序在不同环境下都能正确运行,需要不断修改项目的配置文件,这样的话非常繁琐,应该怎么解决呢?这就需要用到 SpringBoot 提供的多环境开发技术——Profiles。
解决刚刚的问题,最直观的方式就是为每个环境提供独立的数据配置信息,然后指定程序使用运行环境对应的配置信息:
下面就来介绍使用 Profiles 如何达到这种效果。
3.1 多环境开发的单文件配置
SpringBoot 提供的 Profiles 可以用来隔离应用程序配置的各个部分,并在特定环境下指定部分配置生效。
- 如何分隔不同环境的配置?
- 如何指定哪些配置属于哪个环境?
- 如何指定哪个环境的配置生效?
在 yml 配置文件中,分别为开发、测试、生产环境进行信息配置的示例:
#通用信息
spring:
profiles:
active: test #指定生效的环境
server:
servlet:
context-path: /aaa #三个环境中共性的信息: 虚拟目录都是/aaa
---
#开发环境
spring:
config:
activate:
on-profile: dev #环境名称
server:
port: 8081 #端口号
---
#测试环境
spring:
config:
activate:
on-profile: test #环境名称
server:
port: 8082 #端口号
---
#生产环境
spring:
config:
activate:
on-profile: pro #环境名称
server:
port: 8083 #端口号
启动程序,程序运行在测试环境,端口号是 8082,虚拟目录是 /aaa:
如果特定环境中的配置和通用信息冲突了,特定环境中的配置生效。
启动程序,程序运行在开发环境,端口号是 8081,虚拟目录是 /bbb:
如果在 yml 配置文件中,每个环境的配置信息都非常多,就会很难维护,修改配置很容易出错,如何解决呢?
3.2 多环境开发的多文件配置
- 通过多个文件分别为不同环境配置属性
- 不同环境的配置文件名字为
application-环境名称.yml
- 在
application.yml
中激活指定环境
示例:
3.3 多环境开发-分组
在前面,我们已经把不同环境的配置信息书写到了不同配置文件下,这样就能一定程度上减少单个配置文件的信息。但是这种拆分方式有时还是不能满足开发中的需求,把某个环境的配置信息都写到一个文件中,配置信息还是太多,依然不利于维护。
比如将来可能会在开发环境相关的配置文件中配置很多信息:服务器相关配置、数据源相关配置、自定义配置……
这样,一个配置文件可能会有几百行代码,维护起来还是很困难。为了解决这个问题,profiles 提供了分组功能:
- 按照配置的类别,把配置信息配置到不同的配置文件中
application-分类名.yml
- 在application.yml中定义分组
spring.profiles.group
- 在application.yml中激活分组
spring.profiles.active
(不再是指定某个文件了,而是组的名称)
示例: