1. 概述
屬性文件是一種常用的方法,我們可以用來存儲項目特定的信息。理想情況下,我們應該將其外部化,以便在需要時能夠靈活地修改配置。
在本快速教程中,我們將探討在 Spring Boot 應用程序中從位於 JAR 外的位置加載屬性文件的各種方法。
2. 使用默認位置
根據約定,Spring Boot 會在以下預定義位置查找外部化配置文件——<em><span><span><span>application</span><span>.</span><span>properties </span></span></span></em><span><span><span>或 <em>application.yml</em></span></span></span></span>:
以下是優先級順序:
- 當前目錄的
<em>/config</em>子目錄 - 當前目錄
- 類路徑下的
<em>/config</em>包 - 類路徑根目錄
因此,如果在 <em>/config</em> 子目錄中定義一個屬性並將其放置在當前目錄中,則該屬性將被加載。如果存在衝突,它將覆蓋類路徑中其他位置的屬性。
3. 使用命令行
如果上述約定對我們不起作用,我們可以在命令行中直接配置位置:
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"4. 使用環境變量
現在假設我們無法修改啓動命令。
很棒的是,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請注意,默認文件仍將被加載。但是,特定環境的屬性文件在屬性衝突的情況下會優先使用。
5. 使用應用程序屬性
正如我們所見,在應用程序啓動之前,必須定義 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.properties6. 通過編程方式
如果我們需要通過編程方式訪問,可以註冊一個 PropertySourcesPlaceholderConfigurer Bean:
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer properties =
new PropertySourcesPlaceholderConfigurer();
properties.setLocation(new FileSystemResource("/Users/home/conf.properties"));
properties.setIgnoreResourceNotFound(false);
return properties;
}我們這裏使用了 PropertySourcesPlaceholderConfigurer 從自定義位置加載屬性。
7. 從胖文件中排除文件
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 包中排除在外。
8. 結論
本文介紹了 Spring Boot 框架如何自動處理外部化配置,從而簡化了我們的工作。
通常,我們只需要將屬性值放置在正確的文件和位置即可。 此外,我們還可以使用 Spring 的 Java API 以獲得更大的控制權。