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.pswp.cn/diannao/75792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75792.shtml
英文地址,請注明出處:http://en.pswp.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;結合工具使用與…