Spring-Boot application.yml 文件拆分,实现 maven 多环境动态启用 Profiles

JavaWeb项目文件结构深度解析:从Maven标准到微服务架构实践 在软件工程领域,清晰的项目文件结构是保障代码可维护性和团队协作效率的基石。其核心原理在于通过约定俗成的目录组织方式,实现代码的高内聚、低耦合,从而降低系统复杂度。从技术价值看,规范的结构不仅能提升开发体验,更是实现持续集成、自动化部署等现代工程实践的前提。在JavaWeb开发中,这一理念通过Maven/Gradle的标准化目录得以落地,并广泛应用于单体应用分层、微服务模块化等典型场景。本文聚焦Spring Boot技术栈,结合pom.xml配置管理、多环境配置等热词,以及资源映射、构建产物等工程细节,系统阐 阅读详情

 

Spring-Boot / 更新于 2018-10-24 / 2 条评论 / 8,404 次浏览 / 宇来YuLai

转载请注明, 原文地址:Spring-Boot application.yml 文件拆分,实现 maven 多环境动态启用 Profiles

在实际使用环境中,我们同一个应用环境可能需要在不同环境运行(开发、测试、生产等),每个环境的参数都有可能不同(连接参数、日志级别等),使用 Spring-Boot 的 Profiles 可以将不同环境下的参数进行拆分,并指定加载。

1. 使用 Spring-Boot Profiles 拆分 application.yml 文件

首先我们有一个非常简单的 application.yml 文件

database: mysql
spring:
    datasource:
        url : jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
        username : root
        password : 12345678

Yml

我们现在有开发环境(dev)、测试环境(test)、生产环境(prod)

修改application.yml 文件

database: mysql

spring:
  profiles:
    active: dev

#这两行实际没意义,如果有其他公共参数可以补充进来
spring:
    datasource:

#开发环境
spring:
  profiles: dev

spring:
    datasource:
        url : jdbc:mysql://127.0.0.1:3306/dev?characterEncoding=UTF-8
        username : root
        password : 12345678

#测试环境
spring:
  profiles: test

spring:
    datasource:
        url : jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
        username : root
        password : 12345678

#生产环境
spring:
  profiles: prod

spring:
    datasource:
        url : jdbc:mysql://127.0.0.1:3306/prod?characterEncoding=UTF-8
        username : root
        password : 12345678

Yml

我们只需要在 spring.profiles.active 指定使用的 profiles

当然目前来说,这种配置文件并不符合我们的需求,我们需要把不同环境的参数放到不同的文件中。

通过与配置文件相同的命名规范,创建 application-{profiles}.yml 文件 存放不同环境的参数。

修改 application.yml

database: mysql

spring:
  profiles:
    active: dev

#这两行实际没意义,如果有其他公共参数可以补充进来
spring:
    datasource:

Yml

创建 application-dev.yml

spring:
    datasource:
        url : jdbc:mysql://127.0.0.1:3306/dev?characterEncoding=UTF-8
        username : root
        password : 12345678

Yml

2. 启动参数

如果 spring.profiles.active 没有指定值,那么只会使用没有指定 spring.profiles 的值,也就是只会加载通用的配置。

并且我们可以在启动应用程序的时候,对 spring.profiles.active 进行指定,这样就不需要每次修改环境都需要手动修改配置文件再编译。

例如运行 Jar 包,指定使用 dev 环境参数:

java -jar xxx.jar --spring.profiles.active=dev

Shell

3. 使用 Maven 在打包时只加载特定的 Profiles 配置文件

由于各种各样的原因,我们肯定希望打出哪个环境的包,就只需要包含这个环境的配置文件即可,不想包含其他环境的配置文件,这时候可以直接在 maven 中使用 profiles 和 resources 来配置,打包时使用 mvn package -P dev 即可,仍然使用 java -jar xxx.jar --spring.profiles.active=dev 来运行。

<profiles>
    <!--开发环境-->
    <profile>
        <id>dev</id>
        <properties>
            <spring.profiles.active>dev</spring.profiles.active>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!--测试环境-->
    <profile>
        <id>test</id>
        <properties>
            <spring.profiles.active>test</spring.profiles.active>
        </properties>
    </profile>
    <!--生产环境-->
    <profile>
        <id>prod</id>
        <properties>
            <spring.profiles.active>prod</spring.profiles.active>
        </properties>
    </profile>
</profiles>
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources.${spring.profiles.active}</directory>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

XML

4. 使用 Maven 在打包时自动通知 Spring-Boot 加载的 Profiles 环境参数

虽然每次都可以打包成相应配置文件的 Jar 包,但是每次运行,都得用 --spring.profiles.active 参数来指定运行环境,打包时指定一次,运行时指定一次,确实很麻烦。

不自动不舒服,下面我们就来看看怎么把这个参数可以省略掉。

首先我们得知道,加这个参数的原因就是想着项目中存在多个环境,这个环境是需要在 application.yml 中配置,或者运行时通过参数指定。

实际上我们在使用 maven 打包时就能确定我们所选的运行环境,所需要的配置文件,那么我们不想在运行时通过参数来指定,那么我们可不可以修改 application.yml 配置文件呢,这样就不需要我们运行时来指定参数了吧。

下面就介绍两种方法来实现这个功能:

4.1. 方法1:利用 maven filter 来替换标记的内容

这个方法直接在上一步的基础上,增加一个占位符标记,并且在 resource 中将过滤器打开。

修改 pom.xml 文件

<!-- profiles部分不变 -->
<properties>
    <resource.delimiter>#</resource.delimiter>
</properties>
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources.${spring.profiles.active}</directory>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

XML

修改 application.yml 文件

spring:
    profiles:
        active: #spring.profiles.active#

Yml

这里我们通过 <resource.delimiter>#</resource.delimiter> 重写定义了一个占位符,其实熟悉 maven 的朋友都知道,maven 本身有自带的占位符 ${...} ,但是在 Spring-Boot 中不行,这个占位符被 Spring-Boot 占用了,所以我们就得重新定义一遍。再通过 <filtering>true</filtering> 这样的一个设置,打开过滤器开关,这样 application.yml 文件中的 #spring.profiles.active# 部分就会替换为 pom.xml 里 profiles 中定义的 spring.profiles.active 变量值。

4.2. 方法2:利用 maven-resources-plugin 插件

maven 的 maven-resources-plugin 插件使用方法也是很简单的,首先,干掉我们上面所用的 <build><resources></resources></build> 这插件就是用来代替他的高级版。

接着我这里有一个示例,一看就懂的那种。

修改 pom.xml 文件

<!-- profiles部分不变 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <executions>
                <execution>
                    <id>default-resources</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/classes</outputDirectory>
                        <useDefaultDelimiters>false</useDefaultDelimiters>
                        <delimiters>
                            <delimiter>#</delimiter>
                        </delimiters>
                        <resources>
                            <resource>
                                <directory>src/main/resources/</directory>
                                <filtering>true</filtering>
                            </resource>
                            <resource>
                                <directory>src/main/resources.${spring.profiles.active}</directory>
                                <filtering>false</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

XML

修改 application.yml 文件

spring:
    profiles:
        active: #spring.profiles.active#

Yml

注意看 pom.xml 中的 <delimiter>#</delimiter> 定义了一个占位符,可以在复制文件的时候,在文件中查找 #...# 将其中的内容进行替换。

通过以上两种方法修改后,再次运行 mvn package -P dev 打包,将生成的 Jar 包用 RAR 解压,直接查看 application.yml 文件,我们可以看到原来的 #spring.profiles.active# 已经被替换成了 dev ,这样在运行 Jar 包时就不需要进行参数指定,直接运行 java -jar xxx.jar 即可。


参考链接

Spring Boot教程 – Spring Boot Profiles实现多环境配置切换

如何在@SpringBootTest中动态地启用不同的profiles

spring boot通过maven filter替换properties属性(多环境配置)

Spring Boot项目Maven打包全攻略:从Fat Jar到Docker分层构建 在Java应用开发中,依赖管理和打包部署是保障应用可移植性与一致性的核心环节。其原理在于通过构建工具将项目代码与第三方库组织成可独立运行的部署单元。这一技术对于实现持续集成、环境标准化和云原生部署具有关键价值,广泛应用于微服务架构、容器化部署等场景。本文聚焦于Spring Boot项目,深入解析如何使用Maven插件实现高效打包。通过对比Fat Jar、Thin Jar及Docker分层镜像等不同策略,并结合依赖冲突、资源路径等高频问题,提供从基础配置到CI/CD集成的实战指南,帮助开发者构建可靠、高效的部 阅读详情

相关推荐

Spring Boot 启动原理深度解析:从 SpringApplication 到 ApplicationContext

Spring Boot 启动过程并非黑盒,而是由 SpringApplication 驱动的标准化初始化流水线。其核心原理涵盖环境准备、上下文构建与启动收尾三大阶段,依赖 ApplicationContextInitializer、ConditionEvaluationReport 等关键机制实现条件化自动配置。该设计在保障开发效率的同时,也带来 DataSource 配置缺失、Web 类型误判、Bean 扫描越界等典型故障。理解这一原理,是诊断 NoSuchBeanDefinitionException、

weixin_30482383的博客 463

SpringBoot - 配置文件application.yml使用详解(附:Profile多环境配置)

(1)YAML 是 JSON 的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代 application.properties。(2)在创建一个 SpringBoot 项目时,引入的 spring-boot-starter-web 依赖间接地引入了 snakeyaml 依赖, snakeyaml 会实现对 YAML 配置的解析。(3)YAML 的使用非常简单,利用缩进来表示层级关系,并且大小写敏感。

m0_56753567的博客 1万+

Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6

`Spring Cloud` 构建于 `Spring Boot` 之上,在 `Spring Boot` 中有两种上下文,一种是 `bootstrap`,另外一种是 `application`。

gmHappy 7429

通过maven 打包 包含指定的profiles

需求:资源文件根据不同的环境进行拆分,打包的时候只想根据目标环境将需要的资源文件包含进去。具体的资源环境如下图所示。 解决方案: pom.xml文件配置 首先是在待打包的资源文件中排除掉application-*.yml, <resource> <directory>src/main/resources</directory> <excludes>

m0_37987037的博客 8704

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 459

应广单片机 按键点灯 PMS171B GPIO LED

我也是第一次使用这款单片机,参考网友的资料,写个最近简单的demo 测试用例 #include "extern.h" /*端口定义*/ BIT KEY : PA.0; BIT SW : PA.4; /*相应于main函数*/ void FPPA0 (void) { /*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/ .ADJUST_IC...

大江的专栏 999

Springboot application.yml配置文件拆分

尽管使用Springboot减少了很多配置,但还是有一些配置需要大量的手工操作,而YML格式的配置文件在配置较少时,比较直观,但是在配置较多时,就不是很好了,因此拆分配置文件就很有必要了,拆分配置文件也比较简单。 # application.yml 文件 spring: profiles: include: - sharding - kanyun 主配置文件中通过spring.profiles.include来引入其他配置文件 # application..

kanyun123的博客 4014

Redash离线环境部署2020.1(centos+windows)

背景 Redash是一款开源的BI系统,核心功能是添加数据源,然后进行数据的可视化展示。一般会拿出来同Supervisor和Metabase进行选型比较,这里对三者的选型不做细致分析。而是给出在Redash开发环境部署踩过的坑,很多坑是自己琢磨出来的,网上几乎找不到更新的资料。适用于没怎么用过linux,也不怎么熟悉python的,用的是最新(master)的redash的代码(上一个发布版本...

Jone_wan的专栏 2136

Spring-Boot application.yml 文件拆分,实现 maven 多环境动态启用 Profiles

Spring-Boot application.yml 文件拆分,实现 maven 多环境动态启用 Profiles

haoweng4800的博客 228

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 153

使用FSL对DTI数据进行预处理

在fsl官网我们可以看到是同时使用了AP和PA图像处理,采用的是最小二乘法将2个图像合并为1个图像。–inindex此处需要处理的是PA图像,在acq_param.txt中我们是把这个放在第一行的,此处为1,如果处理的是AP图像,则此处为2。为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。即如果AP和PA只有1个B0像时,那么这里就是两行,如果各有3个B0像则这里应该是6行。假设转换后的图像为sub01_AP.nii.gz和sub01_PA.nii.gz。

weixin_52073820的博客 4839

Spring Boot入门指南:从核心原理到项目实战

在Java企业级应用开发中,框架的简化与效率提升是开发者持续追求的目标。Spring Boot通过“约定大于配置”的设计理念,实现了对Spring框架的革命性封装,其核心机制包括自动配置和起步依赖。自动配置能够根据项目Classpath自动推断并装配所需组件,而起步依赖则通过预定义的依赖包集合,解决了传统开发中令人头疼的版本冲突问题。这些技术显著降低了项目搭建和配置的复杂性,使开发者能更专注于业务逻辑实现。其价值在于极大地提升了开发效率,并推动了微服务架构的落地实践。典型的应用场景包括快速构建RESTful

weixin_30655569的博客 299

ComfyUI报错ModuleNotFoundError: No module named ‘comfy.options‘

好家伙,我一想我刚刚好像用了pip安装了comfy模块,不会是和ComfyUI自带的comfy模块产生冲突了吧。(3)还有的说是项目不是最新版,叫更新到最新版本的,好家伙,我报错之前根本没更新也没错,突然就报错的。(4)还有的说没有comfy.options这部分代码,叫自己去拉一个,我一看也有啊。我也不知道啥时候脑抽风去装这么个东西的,幸好我聪明机智,一眼就知道了。看把我气的,然后网上搜集各种资料,一个一个去试。

满目星辰 5155

【Spring Boot多环境配置终极指南】:掌握3种高效激活策略,告别环境混乱

轻松解决Spring Boot多环境配置难题,掌握3种高效激活策略。涵盖开发、测试、生产环境适用场景,详解profile配置、命令行激活及配置文件管理优势,提升项目部署效率。Spring Boot的多环境激活实用指南,值得收藏。

SimTrans的博客 742

5.4 GTT BO的内存分配分析

本文分析了AMD GPU驱动中的GTT技术实现。GTT作为GPU页表,负责管理主机内存与GPU虚拟地址的映射,支持大容量内存访问和统一寻址。文章详细介绍了GTT的核心数据结构amdgpu_gtt_mgr、初始化流程,以及BO(Buffer Object)创建时GTT区间的分配与释放机制。GTT管理通过TTM框架实现分层设计,提供内存统计、兼容性检查等接口,并支持动态迁移、多进程隔离等高级特性。该机制为AMD GPU提供了高效灵活的内存管理基础。

图形/计算GPU的驱动与虚拟化技术分享园地 3722

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1930

Spring Boot环境切换混乱?这6种标准化激活方法你必须掌握

解决Spring Boot多环境配置混乱问题,本文详解6种标准化激活方式,涵盖profile配置、命令行、Maven及IDE等场景,确保环境切换准确高效。方法实用可靠,值得收藏。

ByteChat的博客 677

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Boot多环境配置避坑指南(9大常见错误及解决方案)

掌握Spring Boot配置多环境profile的正确方式,解决开发、测试、生产环境切换难题。涵盖9大常见错误及解决方案,详解application.yml配置、激活方式与最佳实践,提升项目部署效率,值得收藏。

ByteGlow的博客 427

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring Boot多环境配置管理实战:从Profile机制到生产部署

在软件工程中,配置管理是连接开发与部署的关键桥梁,其核心在于实现‘一套代码,多处部署’。Spring Boot通过Profile机制,提供了一套优雅的解决方案,允许开发者预先定义不同环境(如开发、测试、生产)的配置,并在运行时动态激活。这一原理不仅实现了代码与环境的解耦,更提升了部署的灵活性与安全性,其技术价值在于保障了环境一致性、提升了发布效率并降低了配置泄露风险。在微服务、云原生等应用场景下,结合环境变量、配置中心等实践,能够构建出健壮、可维护的配置体系。本文聚焦于Spring Boot多环境配置,通过

weixin_34037515的博客 291

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Boot核心原理与实践:从自动配置到生产部署

在Java企业级应用开发中,约定大于配置是一种重要的设计范式,旨在通过预设最佳实践来减少繁琐的XML和代码配置,从而提升开发效率。其核心原理在于依赖自动装配和条件化加载机制,通过分析类路径、Bean定义和属性设置,智能地初始化应用组件。这一技术价值在于显著降低了项目启动和维护的复杂性,使得开发者能更专注于业务逻辑实现。在微服务架构和云原生场景下,这种开箱即用的特性尤为重要,它简化了服务的独立部署与扩展。Spring Boot作为该范式的杰出代表,通过自动配置、Starter依赖和内嵌容器等机制,将这一理念发

weixin_33831673的博客 388

基于Apollo的配置中心实战:三环理论与Spring Boot集成指南

配置管理是分布式系统和微服务架构中的核心基础组件,它负责将应用的可变参数从代码中分离,实现外部化管理。其核心原理在于通过中心化的存储和动态推送机制,实现配置的统一管理、实时更新和版本控制。这项技术的价值在于提升系统的灵活性、可维护性和安全性,避免因配置变更导致的服务重启和部署中断。在应用场景上,配置中心广泛应用于多环境隔离、功能开关、业务参数动态调整和敏感信息加密管理。本文聚焦于配置管理的“三环”理论——环境隔离、动态推送与审计追溯,并以Apollo配置中心为例,结合Spring Boot框架,详细演示如何

weixin_34176694的博客 368

SpringBoot3 配置文件与自动配置原理

Initializer 生成的默认启动规则可自定义改造,通过原生API修改启动横幅、运行参数等,支持两种写法:// 关闭启动横幅.run(args);// 公共配置父类:所有业务子类继承复用// 通用属性@Min(1000)// 通用get/set// 订单业务配置子类,继承通用父类@Component@Validated// 子类独有属性首先创建一个空 Maven 工程作为项目全局父工程,打包方式必须为pom,仅用于统一管理,无业务代码。

只要肯攀登,终有登顶时 460

《Spring Boot 4 与 Nacos 3.2.3 最强整合实战:配置管理 + 服务发现全解析》

本文介绍了如何基于SpringBoot 4.1.0(需JDK17+)与Nacos 3.2.3构建微服务系统。主要内容包括:1. 环境准备,强调必须开放Nacos的8848(HTTP)和9848(gRPC)端口;2. 项目初始化,提供父/子POM配置示例;3. 关键配置说明,特别是bootstrap.yml的加密参数配置;4. 主启动类实现服务注册发现功能。文章重点解决了新版Nacos的多端口机制、SpringBoot 4.x适配等常见问题,为开发者提供了一套完整的微服务搭建方案。

zsx8096的博客 201

【springboot】万字操作指南 Spring Boot 2.x 升级到 3.x:微服务项目实战

摘要: 本文提供Spring Boot 2.x升级到3.x的实战指南,重点针对微服务项目。升级涉及JDK 17、Spring Framework 6、Jakarta EE等连锁变化,需系统规划版本矩阵(如Spring Boot 3.5.x + Spring Cloud 2025.0.x)。建议升级路线:先统一JDK 17环境,再处理依赖迁移(javax→jakarta)、Spring Security 6适配、OAuth2授权服务器改造等关键步骤。

Cjh20pan的博客 967
上一篇: numactl
下一篇: JProfiler入门教程(2)--JProfiler安装
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值