Spring Boot 配置 jar 包外面的 Spring Properties 文件

发布时间:2022-10-13 MOCK SERVER

一、概述

Properties 文件是我们可以用来存储项目特定信息的常用方法。理想情况下,我们应该将其保留在 jar 包之外,以便能够根据需要对配置进行更改。

在这个教程中,我们将研究在 Spring Boot 应用程序 中从 jar 外部位置加载 Properties 文件的各种方法。

二、使用默认位置

按照惯例,Spring Boot 按以下优先顺序在四个预定位置查找外部化配置文件 --- application.properties 或 application.yml :{#crayon-5c73a186c8530009937282}

  • 当前目录的 /config 子目录
  • 当前目录
  • 一个类路径 /config 包
  • 类路径根

因此,在 application.properties 中定义并放置在当前目录的 /config 子目录中的属性将被加载。 这也会在发生冲突时覆盖其他位置的属性。

三、使用命令行

如果上述约定对我们不起作用,我们可以直接在命令行中配置位置:

java -jar app.jar --spring.config.location=file:///Users/home/config/jdbc.properties

我们还可以传递应用程序搜索文件的文件夹位置:

java -jar app.jar --spring.config.name=application,jdbc --spring.config.location=file:///Users/home/config

最后,另一种方法是通过 Maven 插件 运行 Spring Boot 应用程序。

在那里,我们可以使用 -D 参数:

mvn spring-boot:run -Dspring.config.location="file:///Users/home/jdbc.properties"

四、使用环境变量

现在假设我们不能更改启动命令。

很棒的是 Spring Boot 还会读取环境变量 SPRING_CONFIG_NAME 和 SPRING_CONFIG_LOCATION:

export SPRING_CONFIG_NAME=application,jdbc
export SPRING_CONFIG_LOCATION=file:///Users/home/config
java -jar app.jar

请注意,仍将加载默认文件。但是环境特定的属性文件优先以防发生属性冲突。

  1. 使用应用程序属性

如我们所见,我们必须在应用程序启动之前定义 spring.config.name 和 spring.config.location 属性,因此在 application.properties 文件(或 YAML 对应文件)中使用它们将没有影响。

Spring Boot 在 2.4.0 版本中修改了属性的处理方式。

与此更改一起,团队引入了一个新属性,允许直接从应用程序属性导入其他配置文件:

spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties
  1. 以编程方式

如果我们想要编程访问,我们可以注册一个 PropertySourcesPlaceholderConfigurer bean:

public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer properties = 
      new PropertySourcesPlaceholderConfigurer();
    properties.setLocation(new FileSystemResource("/Users/home/conf.properties"));
    properties.setIgnoreResourceNotFound(false);
    return properties;
}

在这里,我们使用 PropertySourcesPlaceholderConfigurer 从自定义位置加载属性。

七、从 Fat Jar 中排除文件

Maven Boot 插件会自动将 src/main/resources 目录下的所有文件包含到 jar 包中。

如果我们不想让某个文件成为 jar 的一部分,我们可以使用一个简单的配置来排除它:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>**/conf.properties</exclude>
            </excludes>
        </resource>
    </resources>
</build>

在这个例子中,我们过滤掉了 conf.properties 文件,使其不包含在生成的 jar 中。

八、小结

本文展示了 Spring Boot 框架本身如何为我们处理 externalized configuration。

通常,我们只需要将属性值放在正确的文件和位置。但我们也可以使用 Spring 的 Java API 进行更多控制。

与往常一样,示例的完整源代码可在 GitHub 上 获得。

更多相关推荐


Foxman, 基于微核架构的 Mock 解决方案

是一个使用Node.js开发的命令行工具,定位是一个可扩展的MockServer,帮助前端开发者轻松、独立、高效地进行前端开发和完成后续的联调工作。他不是一款静态文件响应工具,假如你只需要一款轻量的Node.js开发服务器,​背景作为前端开发的我们,在实际的开发场景中会遇到以下问题:环境:进行本地开发,需要起后端环境(Tomcat),对于新人来说,需要大量时间熟悉;熟练的人遇到某些确实存在的问题,...

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

发布时间:2019-01-30 PYTHON MOCK SERVER 接口测试 WEBSERVICE
如有任何学习问题,可以添加作者微信:lockingfree课程目录Python接口测试实战1(上)-接口测试理论Python接口测试实战1(下)-接口测试工具的使用Python接口测试实战2-使用Python发送请求Python接口测试实战3(上)-Python操作数据库Python接口测试实战3(下)-unittest测试框架Python接口测试实战4(上)-接口测试框架实战Python接口测试...

Mock-- Server的使用

发布时间:2018-08-22 EASY MOCK MOCK SERVER
近日项目需求使用mock-server来提供虚拟数据(API),方便在服务被调用方没有开发好的情况下,服务调用方能不被耽误的继续进行开发。我们的情况大概是这样:  我们的服务去调用另一方提供的服务,另一方的服务可能还没有开发好,为了方便项目如期交付,他们只能做一次符合他们那边规则的数据,并且做一次数据非常麻烦,并把接口提供给我们。我们只能通过接口一次访问数据,并把数据保存到movkServer,下...

使用apimocker工具辅助测试

发布时间:2021-11-04 APIMOCKER 测试工具 MOCK SERVER
工具链接:https://github.com/gstroup/apimocker背景:QA在内网部署服务器环境,但系统涉及服务太多,无法部署所有服务,并且ABTest(Maestro)服务使用GoogleOAuth做授权认证,测试环境没有域名,无法搭建实际的Maestro服务。在后端(one-eye)服务的代码中,每次对Maestro服务的请求均返回特定的json字符串,因此这种情况非常适合简单...

mockServer-android

发布时间:2018-03-15 测试 MOCK SERVER
mockServer是什么?mock模仿开发中:为了更好的分工,让客户端不依赖后端环境的情况下进行开发。在双方约定好的报文字段下,搭建本地server就是mockserver。目前我使用最多的情况是。在后台接口开发没有完成时候。自己伪造数据,调试接口。我搭建一个成本非常低的mockserver成本低肯定会有缺陷。望理解。缺陷一:无法验证加密。发请求参数最好关闭加密。缺陷二:不会做参数验证。缺陷三:...

从0到1学会使用SpringBoot 搭建mock Server

发布时间:2020-07-31 SPRINGBOOT 提升 MOCK SERVER
    做过接口测试的同学一定听说过mockServer,大家会觉得其很神秘,很高大上!mockServer出现的原因是现今的业务系统很少有孤立存在的,它们或多或少需要使用兄弟团队或是其他公司提供的服务,这给我们的联调和测试造成了麻烦。于是就有了解决方案——搭建一个临时的server,模拟那些服务,提供数据进行联调和测试。下图很好的解释了什么是Mockserver: 在这里我用springboot...

mock-server & moco初探

发布时间:2018-12-16 JAVA MOCO MOCK SERVER
mock-server&amp;moco初探000.Readme主要介绍mockserver和moco,前者是重点,后者是辅助理解和比较。但其实比较github上的两个项目,无论是在star/fork还是issue/contributors上面都不分伯仲,前者稍微占些优势吧。就主要功能而言,两者差不多,但是mockserver有更多的使用方式和场景,支持更多的语言和环境。001.What/Why/...

SpringBoot中使用Swagger生成RESTful规范API文档

Swagger是为了描述一套标准的而且是和语言无关的RESTAPI的规范。对于外部调用者来说,只需通过Swagger文档即可清楚Server端提供的服务,而不需去阅读源码或接口文档说明。官方网站为:http://swagger.io中文网站:http://www.sosoapi.com背景前后端分离1、前后端仅仅通过异步接口(AJAX/JSON)来编程2、前后端都各自有自己的开发流程,构建工具,测...

教练,模板页面也交给我ba

本文探究如何在传统后端开发的基础上进一步实现前后端分离(配套项目+Webpack多页面应用脚手架)一、前言目前主流开发有大前端和传统后端开发1.大前端开发遵循RESTfulApi,实现前后端分离。前端负责数据渲染、路由跳转和权限等,并需要SEO(搜索引擎优化);后端提供接口。2.传统后端开发采用后端模板渲染,不需要SEO。往往需要前端人员交付静态页面后,后端人员才能完全展开工作。二、更进一步进一步...

程序员知识图谱-Java 内存溢出的排查方法

发布时间:2022-10-13 MOCK SERVER
内存溢出分类Java里面内存溢出主要分以下几种:堆溢出1、内存溢出(无法申请到内存)jstat查看内存使用情况,检查堆参数,一般是申请的内存太大,比如一个特别大的byte数组2、内存泄漏(对象无法回收)可以使用MAT工具里面的PathtoGCRoots定位,一般是一个特大不能回收的对象栈溢出StackOverflowError方法调用层次太深,内存不够新建栈帧,比如一个没有结束条件的递归OutOf...

一文带你了解 MySQL 和 Redis 事务实现对比

发布时间:2022-10-19 MOCK SERVER
我们都知道,如果要实现事务,需要整体保证ACID(A-原子性|C-持久性|I-隔离性|D-一致性),其中一致性是目标,原子性、持久性和隔离性都是手段,所以这里对比一下MySQL和Redis在事务实现上的区别,当然严格意义上来说,Redis由于不满足原子性,不能算真正意义上实现了事务。原子性MySQL-原子性MySQL的原子性是通过undolog保证的,undolog是MySQL的回滚日志,保存的是...

两小时手撕一个 Java 版本的区块链应用程序

发布时间:2022-10-20 MOCK SERVER
一、概述区块链是一种分布式账本技术(DLT),起源可以追溯到2008年中本聪发表的关于比特币的白皮书,它由不断增长的区块组成,这些区块使用加密技术安全地链接在一起。每个区块包含前一个区块的加密哈希、时间戳和交易数据(通常表示为Merkle树,其中数据节点由叶子表示)。时间戳证明交易数据在创建区块时已经存在。由于每个块都包含有关前一个块的信息,因此它们有效地形成了一个链(类似链表数据结构),每个附加...

还在用 JUnit4?手把手教你迁移到 JUnit5

发布时间:2022-10-08 MOCK SERVER
一、概述在本教程中,我们将学习如何从JUnit4迁移到最新的JUnit5版本,并介绍两个版本的库之间的差异。有关使用JUnit5的一般指南,请参阅我们的文章此处。二、JUnit5的优势让我们从以前的版本JUnit4开始,它有一些明显的限制:单个jar库包含整个框架。我们需要导入整个库,即使我们只需要一个特定的功能。在JUnit5中,我们获得了更多的粒度,并且可以只导入必要的内容。在JUnit4中一...

一文带你了解如何使用 Drools 规则引擎进行反向推理

发布时间:2022-11-12 MOCK SERVER
1.概述规则引擎在我们进行业务开发过程中使用非常广泛,比如常见的营销活动的策略定义、金融业务里面的风险评估、征信验证都会使用到规则引擎的能力。在本文里面我们将介绍如何使用Java里面最常用的Drools规则引擎进行反向推理。2.正向推理正向推理是指我们从数据输入开始,得出一个特定的结论。比如使用正向推理可以根据节点之间已知的连接,发现新的路由。3.反向推理与正向推理相反,反向推理是直接从结论(假设...

Redis - 听说 Dragonfly 宣称比我快 25 倍

发布时间:2022-10-17 MOCK SERVER
似乎总有几个项目声称他们已经建立了"世界上最快的键/值存储",有时使用的短语甚至更加离谱,比如以下项目:Redis:https://github.com/redis/redisKeyDB:https://github.com/snapchat/keydbDragonfly:https://github.com/dragonflydb/dragonflySkytable:https://github...

性能优化宝典之序列化

发布时间:2022-10-29 MOCK SERVER
当将数据写入文件、发送到网络、写入到存储时通常需要序列化(serialization)技术,从其读取时需要进行反序列化(deserialization),又称编码(encode)和解码(decode)。序列化作为传输数据的表示形式,与网络框架和通信协议是解耦的。如Dubbo支持Hessian和JSON,HTTP协议支持XML、JSON和流媒体传输等。序列化的方式有很多,作为数据传输和存储的基础,如...

配置 Spring Security 登录后重定向到不同的页面

发布时间:2022-10-10 MOCK SERVER
1。概述Web应用程序的一个常见要求是在登录后将不同类型的用户重定向到不同的页面。例如,将标准用户重定向到/homepage.html页面和将管理员用户重定向到/console.html页面。本文将展示如何使用SpringSecurity快速安全地实现此机制。这篇文章也是建立在SpringMVC教程之上的,该教程涉及设置项目所需的核心内容。2。Spring安全配置SpringSecurity提供了...

一文带你了解 GraphQL 和 REST 的区别和使用场景

发布时间:2022-10-23 MOCK SERVER
一、概述在创建Web服务来支持我们的应用程序时,我们可以选择使用REST或者GraphQL作为通信模式。虽然两者都最有可能在HTTP上使用JSON,但它们有不同的优点和缺点。在本教程中,我们将比较GraphQL和REST。我们将创建一个产品数据库示例,并比较两种解决方案在执行相同的客户端操作时有何不同。二、示例服务我们的示例服务将允许我们:在草稿状态下创建产品更新产品详情获取产品列表获取单个产品的...

在 Thymeleaf 中使用日期的方法

发布时间:2022-10-15 MOCK SERVER
1。介绍Thymeleaf是一个Java模板引擎,能够直接与Spring一起工作。有关Thymeleaf和Spring的介绍,请查看thiswrite-up。除了这些基本功能之外,Thymeleaf还为我们提供了一组实用程序对象,它们将帮助我们在应用程序中执行常见任务。在本教程中,我们将讨论新旧JavaDate类的处理和格式化以及Thymeleaf3.0的一些特性。2。Maven依赖项首先,让我们...