pom.xml与.yml,java配置参数传递

pom.xml与 .yml java配置参数传递

 

在Java项目中,通过 pom.xml 和 .yml 文件(如 application.yml)传递变量通常涉及 构建时(Maven)和 运行时(Spring Boot)两个阶段的配置。以下是具体的实现方法:

 


 

一、从 pom.xml 传递变量到 .yml(构建时注入)

适用于将 Maven 属性(如版本号、环境配置)动态注入到 Spring Boot 的配置文件中。

 

1. 在 pom.xml 中定义属性


<properties><custom.property>value_from_pom</custom.property></properties>

 

2. 启用资源过滤

在 pom.xml 的 <build> 部分配置资源过滤,允许 Maven 替换 .yml 文件中的占位符:


<resources><resource><directory>src/main/resources</directory><filtering>true</filtering> <!-- 启用过滤 --><includes><include>**/*.yml</include></includes></resource></resources>

 

3. 在 .yml 中使用占位符

在 application.yml 中使用 ${...} 引用 Maven 属性:


myapp:property: @custom.property@ # 注意:此处用 @ 而非 $,避免与 Spring 占位符冲突

 

原理

  • Maven 资源过滤默认使用 ${property} 格式,但 Spring Boot 也使用 ${},为避免冲突,改用 @property@

  • 构建时,Maven 会将 @custom.property@ 替换为 pom.xml 中定义的值。

 


 

二、从 .yml 传递变量到 Java 代码(运行时读取)

Spring Boot 自动加载 application.yml,可通过注解直接注入属性。

 

1. 在 .yml 中定义属性


myapp:name: "My Application"timeout: 5000

 

2. 在 Java 类中注入属性

使用 @Value 注解或 @ConfigurationProperties

 

方法 1:@Value


@Componentpublic class MyConfig {@Value("${myapp.name}")private String appName;@Value("${myapp.timeout}")private int timeout;}

 

方法 2:@ConfigurationProperties(推荐)


@Component@ConfigurationProperties(prefix = "myapp")public class MyConfig {private String name;private int timeout;// Getter 和 Setter}

 


 

三、通过 Maven Profile 实现多环境配置

根据不同环境(如开发、生产)动态切换配置。

 

1. 在 pom.xml 中定义 Profiles


<profiles><profile><id>dev</id><properties><environment>dev</environment></properties></profile><profile><id>prod</id><properties><environment>prod</environment></properties></profile></profiles>

 

2. 创建多环境配置文件

  • application-dev.yml

  • application-prod.yml

 

3. 在 application.yml 中激活环境


spring:profiles:active: @environment@ # 由 Maven 动态替换

 

4. 构建时指定 Profile


mvn clean install -Pdev # 激活 dev 环境

 


 

四、常见问题解决

1. 资源过滤未生效

  • 确保 pom.xml 中正确配置了 <filtering>true</filtering>

  • 检查 .yml 文件是否在 <includes> 范围内。

 

2. 占位符冲突

  • 使用 @property@ 代替 ${property} 避免与 Spring 冲突。

 

3. 敏感信息处理

  • 不要将密码等敏感信息硬编码在 pom.xml 中,建议使用环境变量或加密工具(如 Jasypt)。

 


 

通过以上步骤,可以实现 pom.xml 和 .yml 之间的变量传递,灵活管理构建时和运行时的配置。

 

pom.xml与.yml占位符冲突怎么处理

 

在 Java 项目中,Maven (pom.xml) 和 Spring Boot (application.yml) 都使用 ${} 格式的占位符,但两者的解析阶段不同(构建时 vs. 运行时),直接使用相同符号会导致冲突。以下是解决方案和最佳实践:


一、冲突原因分析

阶段      工具        占位符格式解析时机  冲突场景                  
构建时Maven      ${prop}  编译打包时Maven 未替换,Spring 无法解析
运行时Spring Boot${prop}  应用启动时Spring 误解析 Maven 占位符

二、解决方案

1. 修改 Maven 占位符分隔符(推荐)

在 pom.xml 中 自定义 Maven 资源过滤的分隔符,避免与 Spring Boot 的 ${} 冲突。

配置方法:

<project>...<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><!-- 定义 Maven 使用 @ 作为占位符分隔符 --><delimiters><delimiter>@</delimiter> <!-- 关键配置 --></delimiters><includes><include>**/*.yml</include></includes></resource></resources></build>
</project>

在 .yml 中使用 @ 作为占位符:

myapp:version: @project.version@  # 引用 Maven 属性custom: @custom.property@   # 引用 pom.xml 中的自定义属性

优点:

  • 完全避免符号冲突。
  • 无需修改 Spring Boot 配置。

2. 禁用 Spring Boot 对 ${} 的解析(仅限特殊情况)

如果某些 ${} 必须由 Maven 处理,可以 在 Spring Boot 中忽略特定占位符,但需谨慎使用。

在 application.yml 中:

spring:main:banner-mode: offconfig:# 禁用 Spring 对未解析占位符的报错(不推荐)ignore-unresolvable-placeholders: true

缺点:

  • 可能导致 Spring 配置中的真实占位符失效。
  • 隐藏潜在错误,不推荐生产环境使用。

3. 使用 Maven 属性文件传递(替代方案)

将 Maven 属性写入一个临时文件(如 maven.properties),再由 Spring Boot 读取。

步骤:

  1. 在 pom.xml 中生成属性文件:    xml    <plugin>      <groupId>org.codehaus.mojo</groupId>      <artifactId>properties-maven-plugin</artifactId>      <version>1.1.0</version>      <executions>        <execution>          <phase>generate-resources</phase>          <goals>            <goal>write-project-properties</goal>          </goals>          <configuration>            <outputFile>${project.build.outputDirectory}/maven.properties</outputFile>          </configuration>        </execution>      </executions>    </plugin>    

  2. 在 Spring Boot 中读取该文件:    yaml    spring:      config:        import: classpath:maven.properties    

  3. 在 Java 代码中使用属性:    java    @Value("${project.version}")    private String version;    


三、验证与调试

1. 检查构建后的文件

构建完成后,检查 target/classes 目录下的 .yml 文件,确认占位符是否被正确替换:

cat target/classes/application.yml

2. 开启 Maven 调试日志

在构建命令中添加 -X 参数,查看资源过滤过程:

mvn clean install -X

四、最佳实践

  1. 统一约定:    - 使用 @ 作为 Maven 占位符,${} 作为 Spring 占位符。    - 在团队中明确约定符号规则。

  2. 多环境配置:    - 结合 Maven Profile 和 Spring Profile 动态切换环境。    bash    mvn install -Pprod -Dcustom.property=prod_value    

  3. 敏感信息处理:    - 不要将密码等敏感信息硬编码到 pom.xml,使用环境变量或加密工具(如 Jasypt)。


五、常见问题

1. 占位符未被替换

  • 检查 pom.xml 中是否配置了 <filtering>true</filtering>
  • 确认文件路径在 <includes> 范围内。

2. Spring 解析了 Maven 占位符

  • 确保在 .yml 中使用的是 @ 而非 ${}

3. 特殊字符转义

如果属性值包含 @ 或 $,需使用转义:

password: "@@password@@"  # 最终解析为 @password@

通过以上方法,可以彻底解决 pom.xml 和 .yml 的占位符冲突问题,实现构建时与运行时的无缝配置传递。

后端xmlspring bootjava系统架构

发布于2025-03-27著作权归作者所有

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决】:VSCode 中识别不到电脑中的已安装的 Git

# 问题 自己电脑中明明已经安装了 git &#xff0c;但在 vscode 中确识别不到。——————————&#xff08;问题一样就看下去&#xff0c;不一样早早润。省流&#xff01;&#xff01;&#xff01;&#xff01;&#x1f680;&#xff09; # 【第一步】首先要确认你电脑中…

gogs私服搭建

一.介绍&#xff1a; gogs是一个用Go语言开发的自助Git服务&#xff0c;目标是简单、快速搭建Git服务&#xff0c; 支持多种平台&#xff0c;包括Linux、Windows等。它类似于GitHub&#xff0c;但更轻量&#xff0c;适合个人或小团队使用&#xff0c; 在简化git服务搭建流程的…

数位和相等

问题描述 如果一个正整数转化成二进制与转换成八进制后所有数位的数字之和相等&#xff0c;则称为数位和相等的数。 前几个数位和相等的正整数为 11, 88, 99, 6464&#xff0c;…… 请问第 2323 个数位和相等的正整数是多少&#xff1f; import java.util.Scanner; public …

Java-servlet(九)前端会话,会话管理与Cookie和HttpSession全解析

Java-servlet&#xff08;九&#xff09;前端会话&#xff0c;会话管理与Cookie和HttpSession全解析 前言一、什么是会话二、会话管理1. 隐藏的表单域2. 网址重写3. 使用 Cookie3.1 Cookie 的工作流程3.2 Java 中的方法&#xff0c;Cookie 类 三、Cookie 的实现1. 创建 Cookie2…

uniapp开发中store的基本用法和模块化详解

在 UniApp 开发中,状态管理是非常重要的一部分,尤其是在复杂的应用场景下。Vuex 是 Vue.js 的官方状态管理库,可以帮助开发者集中管理应用的状态数据。UniApp 作为基于 Vue.js 的跨平台开发框架,也支持使用 Vuex 进行状态管理。 以下是关于 Vuex 在 UniApp 中的详细用法介…

手写数据库MYDB(一):项目启动效果展示和环境配置问题说明

1.项目概况 这个项目实际上就是一个轮子项目&#xff0c;现在我看到的这个市面上面比较火的就是这个首先RPC&#xff0c;好多的机构都在搞这个&#xff0c;还有这个消息队列之类的&#xff0c;但是这个是基于MYSQL的&#xff0c;我们知道这个MYSQL在八股盛宴里面是重点考察对象…

基于Spring Boot的电动车智能充电服务平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【AI学习】人工神经网络

1,人工神经网络(Artificial Neural Networks,ANNs,连接模型,Connection Model) 模仿动物神经网络行为特征(突触联接的结构),进行分布式并行信息处理的算法数学模型。依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。 2,前馈神…

场馆预约小程序的设计与实现

摘 要 时代在进步&#xff0c;人们对日常生活质量的要求不再受限于衣食住行。现代人不仅想要一个健康的身体&#xff0c;还想拥有一身宛如黄金比例的身材。但是人们平常除了上下班和上下学的时间&#xff0c;其余空余时间寥寥无几&#xff0c;所以我们需要用体育场馆预约来节省…

笔记:纯真IP库

最近需要使用到ip解析成对应的地域&#xff0c;查找了一些资料&#xff0c;发现纯真ip库&#xff0c;这个比较好用&#xff0c;而且社区版可以获得免费授权。 纯真ip库官网地址&#xff1a;https://www.cz88.net/ python版本git地址&#xff1a;https://github.com/tagphi/cz…

骨密度以及骨密度测量,测量方案,意义;提高;实现方案

骨密度及骨密度测量 骨密度&#xff08;Bone Mineral Density, BMD&#xff09; 是指骨骼单位体积或单位面积内矿物质&#xff08;主要是钙和磷&#xff09;的含量&#xff0c;是评估骨骼强度的重要指标。骨密度降低可能导致骨质疏松&#xff0c;增加骨折风险。 简单分析效果&…

MySQL 体系结构与存储引擎

目录 一、MySQL 体系结构 1. 连接层 (Connection Layer) 2. 服务层 (Server Layer) 3. 存储引擎层 (Storage Engine Layer) 二、MySQL 核心存储引擎比较 1. InnoDB (默认引擎) 2. MyISAM 3. Memory (HEAP) 4. 其他存储引擎 三、InnoDB 存储引擎深度解析 1. 核心架构组…

知识就是力量——物联网应用技术

基础知识篇 一、常用电子元器件1——USB Type C 接口引脚详解特点接口定义作用主从设备关于6P引脚的简介 2——常用通信芯片CH343P概述特点引脚定义 CH340概述特点封装 3——蜂鸣器概述类型驱动电路原文链接 二、常用封装介绍贴片电阻电容封装介绍封装尺寸与功率关系&#xff1…

vue复习1~45

1.关于vue 要理解记忆规则&#xff0c;可以到官网上去找 vue的两种使用方式 vue核心包开发 场景&#xff1a;局部模块改造vue核心包 & vue插件 工程化开发 场景&#xff1a;整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…

Netty和Project Reactor如何共同处理大数据流?

在处理大数据流时&#xff0c;Netty和Project Reactor可以协同工作&#xff0c;充分利用Netty的高性能非阻塞IO和Project Reactor的响应式编程模型&#xff0c;实现高效的数据处理和背压控制。以下是如何共同处理大数据流的详细步骤和示例代码&#xff1a; ### 1. Netty和Proj…

【Nginx】location匹配模式与规则

文章目录 一、环境二、匹配模式1. 精准模式2. 前缀模式&#xff08;不继续匹配正则&#xff09;3. 前缀模式&#xff08;继续匹配正则&#xff09;4. 正则模式&#xff08;大小写敏感&#xff09;5. 正则模式&#xff08;大小写不敏感&#xff09; 三、需要注意的地方1. 命中多…

JavaScript基础-定时器

在Web开发中&#xff0c;有时我们需要延迟执行某些操作或者定期重复执行某段代码。JavaScript提供了强大的定时器功能&#xff0c;使得这些需求变得简单易行。本文将详细介绍JavaScript中的定时器&#xff0c;包括setTimeout和setInterval函数的使用方法、注意事项以及一些实际…

【Python】and 和 or 的返回值

文章目录 选项 A选项 B选项 C选项 D正确答案 以下哪些选项输出结果为True ( ) A、print(2 0 or True) B、print(2 ! 0 or True) C、print(str(2) and str(0) or True) D、print(str(2) or str(0) or True)要确定哪些选项的输出结果为 True&#xff0c;我们需要分析每个表达式的…

【deepseek 学c++】weakptr引用场景

std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针&#xff0c;它本身不拥有资源的所有权&#xff0c;仅观察资源的状态&#xff0c;主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值&#xff1a;![ 为…

新手SEO优化实战快速入门

内容概要 对于SEO新手而言&#xff0c;系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点&#xff0c;从网站结构、URL设计到内链布局&#xff0c;逐层拆解搜索引擎友好的技术框架&#xff1b;同时聚焦关键词挖掘与内容策略&#xff0c;结合工具使用与…