一句话总结本章的内容:本文介绍了Maven配置文件加载属性的起源(为解决手动管理多环境配置的痛点)、本质(将不变模板与可变环境信息分离的动态替换机制)、实现步骤(定义属性、开启资源过滤)和核心原理(process-resources阶段通过属性内存空间替换占位符),并用印章和明信片的比喻形象解释了这一过程,最后补充了版本管理中SNAPSHOT与RELEASE的区别。

前言:问题的出现或者说是配置文件加载属性的萌芽。
当代码需要提交到Git仓库,或者交给测试、部署到生产环境时,会发生什么:测试和生产环境的数据库地址、账号密码完全不一样。 这段代码在其他环境根本跑不起来。 |
| 解决办法:每次部署前,都需要手动修改这个Java文件,改成对应环境的配置。 然后重新编译、打包。 |
| 后果:这是一个极易出错且耗时费力的过程,而且存在把测试环境的配置错误地带到生产环境的巨大风险。 |
伴随着Maven的出现,Maven作为一款优秀的项目构建工具,看到了这个普遍存在的痛点。
它想解决的问题是:如何让构建过程自动化,并且能智能地适应不同环境。
它的核心思路就是:将“不变的模板”和“可变的环境信息”彻底分离。
因此为了解决软件开发中日益严重的环境割裂和手动管理混乱的问题,配置文件加载属性应运而生。
配置文件加载属性是什么:
在Maven中,配置文件加载属性本质上是一种将构建过程中的配置信息集中管理和动态替换的机制。
它的核心目的是将那些因环境(开发、测试、生产)不同或频繁变动的值(如数据库连接、依赖版本)抽离出来,用一个可变的"占位符"(${property.name})代替,从而实现配置与代码的解耦。
简单的说,它就像设计一张"填空题"试卷,而试卷本身(代码)是固定的,具体的"答案"(配置值)则可以在不同场景下灵活填入。
配置文件加载属性的步骤:
第一步:在pom文件中统一管理配置文件中的属性
<project><!--
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!--
<version>${spring.version}</version>
</dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</project>
第二步:将属性值动态注入外部配置文件
style="color:#fe2c24">这是配置文件加载属性的精髓。 它能让我们的jdbc.properties、log4j.properties等配置文件也使用Maven中定义的属性。
假设你有一个src/main/resources/jdbc.properties文件,内容如下:
properties
jdbc.driver=com.mysql.jdbc.Driver<--
jdbc.password=123456
步骤一:在pom文件中定义属性:
/>
style="color:#fe2c24">xml
style="color:#fe2c24"><properties>
<!--
<jdbc.url>jdbc:mysql://localhost:3306/mydb_dev</jdbc.url>
</properties>
步骤二:开启资源过滤
需要在 style="color:#fe2c24">配置资源插件,pom.xml的<build>标签中,
-->
<directory>src/main/resources</directory>
<!--
开启过滤,这是实现属性替换的关键!
-->
<filtering>true</filtering>
</resource>
</build>
最后一步
完成以上配置后,执行mvn
process-resources或打包命令,最终生成的jdbc.properties文件中的jdbc.url就会被自动替换为jdbc:mysql://localhost:3306/mydb_dev
形象的说:
我们在这里做一个比喻,把 style="color:#fe2c24">配置文件 style="color:#fe2c24">占位符
而这些数据是在pom.xml文件中注册的(不同的用户有不同的数据,相当于身份证),同时还在pom.xml文件中写到要把对应的数据填写到配置文件properties中(也就是资源过滤器)。
执行
mvn
等命令,并触发资源过滤功能,将数据填充到占位符中。
资源过滤器详解:
style="color:#fe2c24">我们可以把资源过滤器比做成印章,而properties文件中的占位符就是等待被填充的印子,而后执行打包命令时,
compile
process-resources
/>就在这个阶段!
process-resources阶段的具体操作
当Maven执行到process-resources阶段时:
//public
mavenProperties.put("db.url",
"jdbc:mysql://localhost:3306/mydb");
mavenProperties.put("db.username",
"root");
mavenProperties.put("db.password",
"123456");
File("src/main/resources/application.properties");
读取文件内容
"数据库地址:${db.url}\n用户名:${db.username}\n密码:${db.password}"
替换所有占位符
writeFile("target/classes/application.properties",
content);
}
关键:为什么能访问到pom.xml里的值?
Maven在运行时会维护一个属性内存空间,包含:
//Map<String,
mavenProjectProperties.put("db.url",
"jdbc:mysql://localhost:3306/mydb");
mavenProjectProperties.put("project.version",
"1.0.0");
mavenProjectProperties.put("project.build.sourceEncoding",
"UTF-8");
mavenProjectProperties.put("basedir",
"/Users/xxx/my-project");
mavenProjectProperties.put("java.version",
"1.8");
mavenProjectProperties.put("env.JAVA_HOME",
"/usr/lib/jvm/java-8");
版本管理
/>工程版本:
/>项目开发过程中临时输出的版本,称为快照版本
/>RELEASE(发布版本)
/>项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本
/>发布版本alpha版,beta版,纯数字版
最后给大推荐如果您是计算机领域(AI
大数据
软件工程等)的研究者,近期有成果想投稿发表,这几个高认可度的国际会议可以参考(均支持
EI/SCOPUS
检索):
第七届计算机信息与大数据应用会议:
https://ais.cn/u/QnaAJz
第九届先进算法与控制工程会议:
https://ais.cn/u/BFfyuq
/>
结语:
最后的最后,感谢大家观看到最后,如果对你有帮助,请 style="color:#fe2c24">一键三连,点赞,关注(拜托了),收藏,
/>
- 上一篇: 制作高端PPT,电脑网站制作软件有哪些选择?
- 下一篇: 如何创建专业且吸引客户的平阳企业网站?


