如何使用 Spring Boot 配置文件
Posted
技术标签:
【中文标题】如何使用 Spring Boot 配置文件【英文标题】:how to use Spring Boot profiles 【发布时间】:2017-02-24 22:30:52 【问题描述】:我有application.yml
,application-dev.yml
和application-dev.yml
-
我正在使用 maven 命令
mvn spring-boot:run -Dspring.profiles.active=dev
它不起作用,我无法使用 mvn spring-boot:run
选择开发配置文件。我该如何选择?
文档说java -jar XXX.jar --spring.profiles.active=dev
有效,我尝试了-Dspring.profiles.active=dev
,但它不起作用。在我的项目中,我使用java -jar XXX.jar
它运行,但如果我使用java -jar XXX.jar --spring.profiles.active=dev
选择开发配置文件,控制台会打印这么多日志并警告我从未见过使用java -jar XXX.jar
,并告诉我APPLICATION FAILED TO START
那么如何解决两个问题呢?谢谢~
【问题讨论】:
【参考方案1】:我不确定我是否完全理解这个问题,但我会尝试通过提供有关 Spring Boot 中的配置文件的一些详细信息来回答。
对于您的 #1 示例,根据文档,您可以使用 -Drun.profiles
使用 Spring Boot Maven 插件选择配置文件。
编辑:对于 Spring Boot 2.0+,run
已重命名为 spring-boot.run
,run.profiles
已重命名为 spring-boot.run.profiles
mvn spring-boot:run -Dspring-boot.run.profiles=dev
https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/maven-plugin/examples/run-profiles.html
从您的#2 示例中,您在 jar 名称之后定义活动配置文件。您需要在您正在运行的 jar 名称之前提供 JVM 参数。
java -jar -Dspring.profiles.active=dev XXX.jar
一般信息:
您提到您同时拥有application.yml
和application-dev.yml
。使用dev
配置文件运行实际上会加载both 配置文件。来自application-dev.yml
的值将覆盖application.yml
提供的相同值,但将加载来自yml
两个文件的值。
还有多种方法可以定义活动配置文件。
您可以像以前一样定义它们,在运行 jar 时使用 -Dspring.profiles.active
。您还可以使用SPRING_PROFILES_ACTIVE
环境变量或spring.profiles.active
系统属性设置配置文件。
更多信息可以在这里找到: https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-set-active-spring-profiles
【讨论】:
谢谢,你给的方式应该没问题,但正如我所说,我使用java -jar XXX.jar --spring.profiles.active=dev
选择开发配置文件,控制台打印这么多日志并警告我从未见过使用过的`java -jar XXX。 jar, and tell me
APPLICATION 未能启动`但构建成功。 mvn spring-boot:run -Drun.profiles=dev
和java -jar -Dspring.profiles.active=dev XXX.jar
一样,mvn spring-boot:run
和java -jar
可以正常运行。我不小心打开调试模式???
顺序错误,java -jar XXX.jar --spring.profiles.active=dev
确实不将配置文件设置为 dev。您需要使用java -jar -Dspring.profiles.active=dev XXX.jar
我使用java -jar -Dspring.profiles.active=dev XXX.jar
控制台打印了许多日志、警告和调试,但无法启动。 java -jar XXX.jar --spring.profiles.active=dev
这个命令是错误的,但是控制台也会打印很多日志,警告和调试,和使用java -jar -Dspring.profiles.active=dev XXX.jar
一样。我已经尝试了文档中的快速入门,两个命令都可以选择配置文件.springboot版本是1.4.1
在这种情况下,您很可能遇到与您的个人资料无关的其他问题
谢谢@francis,你拯救了我的一天【参考方案2】:
如果您使用的是 Spring Boot Maven 插件,请运行:
mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar
(https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-profiles.html)
【讨论】:
【参考方案3】:自 Spring Boot v2+
我已经使用 Spring Boot v2.3.5.RELEASE 进行了验证
使用 Spring Boot Maven 插件
您可以像这样提供commandline argument:
mvn spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=dev"
您可以像这样提供JVM argument:
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=dev"
java -jar
java -Dspring.profiles.active=dev -jar app.jar
(虚拟机参数)
或
java -jar app.jar --spring.profiles.active=dev
(程序参数)
2021 年 4 月首次更新
我时不时地回到这个问题上。似乎这里发生了 Windows vs *nix 的事情。
recommendation 用于使用mvn spring-boot:run -Dspring-boot.run.profiles=dev
,由于某种原因,这不适用于 Windows 7 终端(命令行提示符),至少对我来说不是。我还没有测试过 Windows 10 终端。但是它确实适用于 Babun(已停产),但不适用于 Git-Bash。尚未测试 Babun 和 Git-Bash 都基于其构建的 Cygwin。 Windows 10 和 Linux 上的 WSL 应该都能正常工作。
2021 年 4 月第二次更新
今天我升级到使用 Spring Boot v2.4.5 后,问题似乎消失了。mvn spring-boot:run -Dspring-boot.run.profiles=dev
现在可以正常工作了。
【讨论】:
./mvnw spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=prod" ,这行得通,非常感谢!【参考方案4】:您不需要三个 .yml 文件。您可以拥有一个 application.yml 文件并在其中写入配置文件特定属性,其中每个配置文件部分由 3 个连字符 (---) 分隔
接下来,要选择当前的活动配置文件,您也可以在 application.yml 文件中指定,如下所示:
spring:
profiles:
active:
- local
但是,如果您设置环境变量,则此配置将被覆盖,例如: SPRING_PROFILES_ACTIVE = 开发
这是一个满足您要求的示例文件:
# include common properties for every profile in this section
server.port: 5000
spring:
profiles:
active:
- local
---
# profile specific properties
spring:
profiles: local
datasource:
url: jdbc:mysql://localhost:3306/
username: root
password: root
---
# profile specific properties
spring:
profiles: dev
datasource:
url: jdbc:mysql://<dev db url>
username: <username>
password: <password>
【讨论】:
【参考方案5】:如果您使用的是 maven,请在 pom.xml 中定义您的配置文件,如下所示
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<jdbc.url>dbUrl</jdbc.url>
<jdbc.username>dbuser</jdbc.username>
<jdbc.password>dbPassword</jdbc.password>
<jdbc.driver>dbDriver</jdbc.driver>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<jdbc.url>dbUrl</jdbc.url>
<jdbc.username>dbuser</jdbc.username>
<jdbc.password>dbPassword</jdbc.password>
<jdbc.driver>dbDriver</jdbc.driver>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<properties>
<jdbc.url>dbUrl</jdbc.url>
<jdbc.username>dbuser</jdbc.username>
<jdbc.password>dbPassword</jdbc.password>
<jdbc.driver>dbDriver</jdbc.driver>
</properties>
</profile>
默认情况下,即如果未选择任何配置文件,则将始终使用本地配置文件。
要在 Spring Boot 2.x.x 中选择特定配置文件,请使用以下命令。
mvn spring-boot:run -Dspring-boot.run.profiles=dev
如果您想使用特定配置文件的属性构建/编译,请使用以下命令。
mvn clean install -Pdev -DprofileIdEnabled=true
【讨论】:
这仍然应该适用于任意属性吗?我正在查看我生成的战争文件,它仍然具有原始属性。【参考方案6】:mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar
**来源-**https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-profiles.html
基本上,当您的项目中存在多个 application-environment.properties 时需要它。默认情况下,如果您在命令行中传递 -Drun.profiles 或在
中传递 activeByDefault true <profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
没有像上面定义的那样默认选择 application.properties 否则你需要通过附加 -Drun.profiles=dev/stage/prod 来选择。
TL;DR
mvn spring-boot:run -Drun.profiles=dev
【讨论】:
【参考方案7】:如果你使用 maven,
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<profiles>
<profile>dev</profile>
</profiles>
</configuration>
</plugin>
</plugins>
</build>
这将 dev 设置为活动配置文件
./mvnw spring-boot:run
将 dev 作为活动配置文件。
【讨论】:
【参考方案8】:您可以根据配置文件在一个 application.properties(yml) 中指定属性,例如here。然后
mvn clean spring-boot:run -Dspring.profiles.active=dev
应该正确运行它。它对我有用
【讨论】:
-Dspring.profiles.active=dev 是否等同于 -Dspring-boot.run.profiles=dev?这令人沮丧...... brrrrr。 @SimonLogic,请参阅 Amimo Benja 的回答。 这个答案对我不起作用。相反,请参阅@francis 的答案,mvn spring-boot:run -Dspring-boot.run.profiles=dev
有效。
我正在使用Spring Boot Maven Plugin,所以我这样做:mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar
(如下面的其他答案所述)。【参考方案9】:
在资源目录中为运行应用程序所需的每个环境(例如:dev、qa、stg 等)创建特定的 .yml 文件。 image of .yml files in resources directory
如果您在 pom.xml 文件中使用 spring-boot-maven-plugin 2.0.5.RELEASE,您可以在依赖标签中添加配置文件,如下所示。 image of pom.xml spring-boot-maven-plugin (您可以使用多个配置文件标签配置多个配置文件)
然后就可以使用下面的命令来构建和运行项目了。
1) mvn clean install
2) mvn spring-boot:run -Dspring-boot.run.default==qa
然后您会看到在运行项目时默认配置文件设置为 qa。 displaying the default profile when running the application
【讨论】:
【参考方案10】:使用 Intellij,因为我不知道如何将键盘快捷键设置为mvn spring-boot:run -Dspring.profiles.active=dev
,所以我必须这样做:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-Dspring.profiles.active=dev
</jvmArguments>
</configuration>
</plugin>
【讨论】:
【参考方案11】:@Profile 注解允许你表明一个组件是 当一个或多个指定的配置文件符合注册条件时 积极的。使用上面的示例,我们可以重写 dataSource 配置如下:
@Configuration
@Profile("dev")
public class StandaloneDataConfig
@Bean
public DataSource dataSource()
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
还有一个:
@Configuration
@Profile("production")
public class JndiDataConfig
@Bean(destroyMethod="")
public DataSource dataSource() throws Exception
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
【讨论】:
【参考方案12】:在 Intellij IDEA 中使用“-Dspring-boot.run.profiles=foo,local”。它正在工作。它设置了 2 个配置文件“foo 和 local”。
已通过启动版本“2.3.2.RELEASE”和 Intellij IDEA CE 2019.3 验证。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
使用“mvn spring-boot:run”设置配置文件
设置环境变量
【讨论】:
【参考方案13】:或者,可以通过添加以下行直接在 application.properties 文件中指定配置文件:
spring.profiles.active=prod
配置文件与 Spring Boot 属性文件一起工作。默认情况下,Spring Boot 会解析一个名为 application.properties 的文件——位于 src/main/resources 目录中——以识别配置信息。
我们的第一个任务是在该文件中添加一个参数,该参数将告诉 Spring 使用与活动配置文件(即应用当前正在运行的配置文件)对应的不同环境特定属性文件。我们可以通过将以下内容添加到 application.properties 文件来做到这一点:
spring.profiles.active=@activatedProperties@
现在我们需要创建两个新的特定于环境的属性文件(在与现有 application.properties 文件相同的路径中),一个由 DEV 配置文件使用,一个由 PROD 配置文件使用。这些文件需要命名如下:
应用程序-dev.properties
应用程序-prod.properties
在每种情况下,我们都将 prod 指定为活动配置文件,这会导致选择 application-prod.properties 文件进行配置。
【讨论】:
以上是关于如何使用 Spring Boot 配置文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring boot + .yaml 创建配置文件?
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何在 XML 配置文件中使用 Spring Boot 自动配置的 bean?