SpringBoot15-项目部署

一、SpringBoot项目部署

二、Springboot属性配置方式

需求:项目打包完成后,需要修改端口号

一般是通过配置文件:application.yml修改的,但是一般项目打包好后,就不能修改了。

方式一:命令行参数方式

方式二:环境变量方式

SpringBoot jar 在启动的时候,会自动读取所在系统的环境变量。

也就是说:

  • 你在 Windows 本地启动 → 读 Windows 的环境变量

  • 你把 jar 放到 Linux 服务器 启动 → 读 服务器的环境变量

它不会读你电脑的环境变量跑到服务器去 ,只会读 运行它的那台机器的环境变量


1、系统环境变量在哪里被读取?

SpringBoot 在启动的时候会按优先级读取:

优先级高 → 低 来源 示例
1 启动命令参数 java -jar app.jar --server.port=9999
2 系统环境变量 DB_PWD=xxx
3 外部配置文件application.yml / properties 配置文件写死的
4 项目内部resources下的配置文件

所以:

配置越"靠上",优先级越高,就会覆盖下面的。

2、springboot读取环境变量的底层逻辑

具体负责这件事的是:

java 复制代码
org.springframework.boot.context.config.ConfigDataEnvironment

在 Spring Boot 启动过程中,这段代码会自动去收集所有可用的配置源,包括:

  • application.yml / properties

  • application-xxx.yml

  • 系统环境变量

  • JVM 启动参数(--server.port=8081

  • 操作系统 Shell 环境变量(export DB_PWD=abc123

  • .env 文件

  • Spring Cloud Config 等(可选)


3、真正触发读取环境变量的代码位置(底层)

Spring Boot 的主入口:

java 复制代码
public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

这个 .run() 里面会:

→ 创建 ConfigurableEnvironment

→ 调用 applyToEnvironment()

→ 然后 ConfigDataEnvironment 去解析所有配置源

→ 包括 环境变量


关键类:

复制代码
org.springframework.boot.SpringApplication
org.springframework.boot.context.config.ConfigDataEnvironment
org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor

关键接口:

复制代码
Environment
PropertySource

4、举个例子

假设你在服务器上运行:

复制代码
export DB_PWD=abc123
java -jar app.jar

你的 application.yml

复制代码
spring:
  datasource:
    password: ${DB_PWD}

没有写任何 java 代码来取环境变量,对吧?

但是 Spring Boot 启动后:

复制代码
Environment → 发现存在系统变量 DB_PWD → 解析占位符 ${DB_PWD} → 注入到 DataSource

这就是为什么你不用写:

复制代码
System.getenv("DB_PWD")

因为 Spring Boot 框架已经帮你自动做了。


5、高级了解

内部调用链(简化):

复制代码
SpringApplication.run()
 → prepareEnvironment()
   → StandardEnvironment
     → MutablePropertySources
       → addLast(systemEnvironment)

也就是说 系统环境变量变成了 PropertySource ,你项目里所有 @Value / ${} / @ConfigurationProperties 都能直接用。


6、总结

Spring Boot 在启动时自动把环境变量加入配置系统中。你只要在配置文件中写 ${变量名} 就能使用。


方式三:springboot读取外部配置文件(推荐)

这是 Spring Boot 在生产环境最常用、最推荐的做法

Spring Boot 可以在启动时自动读取外部配置文件。

这样你就不需要把数据库密码、Redis 密码、API 密钥等写死在 application.yml 里。


1、外部配置文件可以放在哪里?

Spring Boot 默认会按顺序查找配置文件(优先级由高到低):

优先级 配置文件位置 示例路径
最高 启动命令指定的位置 --spring.config.location=/opt/app/config/
JAR 包同级目录 /opt/app/application.yml
项目内部 resources 目录 src/main/resources/application.yml

记住一句话:

jar 外面的配置,会覆盖 jar 里面的配置。


2、最常用、最实战的方式(推荐)

1)本地打包时不用改配置

你正常保留默认的:

复制代码
src/main/resources/application.yml
2)在服务器创建一个外部配置目录

例如:

复制代码
/opt/app/myapp/
  ├─ myapp.jar
  └─ application-prod.yml   ← 外部配置文件

示例:

3)让 Spring Boot 读取这个文件

启动命令这样写:

复制代码
java -jar myapp.jar --spring.config.location=/opt/app/myapp/application-prod.yml

或者(更推荐,更灵活):

复制代码
java -jar myapp.jar --spring.config.additional-location=/opt/app/myapp/

意思是:

"兄弟你去 /opt/app/myapp/ 目录再找一遍配置文件。"


3、外部配置文件里写什么?

比如 application-prod.yml

复制代码
server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/demo
    username: root
    password: ${DB_PWD}   # 环境变量
  redis:
    host: 127.0.0.1
    port: 6379

logging:
  file:
    name: /opt/app/myapp/logs/app.log

注意:我们把密码用 环境变量 替代,安全又规范。


4、启用对应 profile

如果你想区分开发 / 测试 / 生产:

内置文件:

复制代码
application.yml
application-dev.yml
application-prod.yml

启动时:

复制代码
java -jar myapp.jar --spring.profiles.active=prod

prod 就是使用 application-prod.yml


5、最推荐的"生产部署三件套"(企业标准)

配置内容 存放位置 含义
application.yml JAR 内 默认/公共配置
application-prod.yml 服务器外部 生产环境配置(数据库等)
环境变量 服务器 保存密码和敏感数据

这样做的好处:

✅ 代码和配置彻底分离

✅ 密码不写进 Git,不会泄露

✅ 服务器不需要改 jar,只改外部配置

✅ 部署升级更安全、可复用性更高


三、Spring Boot 中的"多环境配置方案"

Profiles = Spring Boot 中的"多环境配置方案"

用来解决:

开发环境、测试环境、生产环境 用的配置不一样 怎么办?

比如:

环境 数据库 日志级别
开发(dev) 本地 MySQL debug
测试(test) 测试服务器 MySQL info
生产(prod) 正式服务器 MySQL warn

Profiles 就是用来区分和切换这些配置的。

3-1、使用同一个配置文件

示例:

特定环境中的配置和通用信息冲突了,特定环境下的配置生效!

3-2、使用多个配置文件

示例:

创建多个配置文件,每个文件属于一个环境。

1、如何指定当前使用哪个环境的配置?

3-3、Profiles-分组

前面我们学过:

  • application-dev.yml 是一个环境配置文件

  • application-prod.yml 是另一个环境配置文件

但是, 有时候一个环境里面的配置会很多、很杂、很长,比如:

配置内容 都写在 application-dev.yml 中会变成:
服务器配置 server.port
数据库配置 spring.datasource...
日志配置 logging...
自定义配置 zyd.xxx...

如果全部写在 application-dev.yml,文件会变得又大又乱,不好维护

所以,Spring Boot 允许我们:把同一个环境的配置再分拆成多个文件 ,比如 开发环境(dev) 下:

配置文件名 用来存什么
application-devServer.yml 存服务器相关配置(端口等)
application-devDB.yml 存数据库配置
application-devSelf.yml 存自定义业务配置

也就是说:

·

这叫做 Profile 组分组配置


1、文件结构图:


2、激活方式:

示例:

或者:

3、小结

相关推荐
用户908324602731 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840822 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解2 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解2 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记2 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者3 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840823 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解3 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者4 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺4 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端