我正在使用spring boot 1.5.2,并使用配置文件,但我发现了一件非常奇怪的事情。
在application.yml中配置
spring:
profiles:
active: @profileActive@
应用dev.yml
spring:
profiles: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password:
server:
port: 8080
应用test.yml
spring:
profiles: test
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2
username: root
password:
server:
port: 8081
我的pom.xml,只包含资源部分和配置文件部分。
<!-- profile -->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<build.profile.id>dev</build.profile.id>
<profileActive>dev</profileActive>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<build.profile.id>test</build.profile.id>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<build.profile.id>prod</build.profile.id>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application-${profileActive}.yml</include>
<include>application.yml</include>
<include>templates/*</include>
</includes>
</resource>
</resources>
我现在正在尝试使用测试资料,发现一切都是oK,@profileActive@
已被替换为test
;
mvn clean package -Dmaven.test.skip=true -Ptest
看起来一切都还好。
但是当我尝试运行jar时,它总是使用 dev 个人资料,虽然application.yml
显示我们现在使用的是test or prod
个人资料。
我不知道我的yml配置出了什么问题。我尝试在一个application.yml文件中包含所有配置文件配置。但该应用程序仍在使用dev
个人资料。
在一个application.yml文件中完全配置
spring:
profiles:
active: @profileActive@
---
spring:
profiles: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password:
server:
port: 8080
---
spring:
profiles: test
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2
username: root
password:
server:
port: 8081
---
spring:
profiles: prod
server:
port: 9000
最后,我尝试使用属性文件,我的所有配置都运行正常,当我运行我的应用程序时可以使用正确的配置文件。
现在,我只是想知道我的yml配置有什么问题。
提前致谢!
答案 0 :(得分:2)
尝试像
一样运行你的jarjava -jar -Dspring.profiles.active=test yourapp.jar
或在您需要的个人资料名称上替换@ profileActive @。
答案 1 :(得分:1)
最后,我找到了原因。
我的项目是一个多模块maven项目。
我正在使用yml
格式的一个模块,
和其他是property
格式。
当我将两个模块都设为yml格式时,一切正常。
谢谢你们所有人!谢谢!答案 2 :(得分:0)
问题可能是,当spring boot读取你的application.yml时,它已经决定回退到默认配置文件。从那以后,我认为,改变配置文件是迟到的。
您可以尝试的是在名为“bootstrap.yml”的配置文件中定义 spring.profiles.active 属性。这可能对你有所帮助。
答案 3 :(得分:0)
我使用spring-boot-starter-web
复制了您的说明作为附加依赖项,以便能够启动一个小型应用程序。
一切都按预期工作。如果我运行mvn clean package -Ptest
,则会激活test
个人资料。与其他配置文件相同。我将所有配置文件放在一个yml
文件中,注释掉<include>application-${profileActive}.yml</include>
,它也有效。
当我从父文件系统路径执行像你这样的JAR文件时,一切都按预期工作。当我同时使用另一个配置文件执行另一个Maven构建并重新启动应用程序时,将使用新的配置文件。
如果您将mvn clean package
与dev
之外的其他个人资料一起使用,那么任何application-dev.yml
都不可能出现在制作的JAR中。如果没有clean
和不同的构建版本以及不同的Maven配置文件,它们将全部存放在JAR中。
你使用哪种操作系统?某些东西是否有可能在您的JAR文件中保存文件句柄并且它不会被替换?但是这应该在你的Maven构建中发出信号。
答案 4 :(得分:0)
我个人会做以下事情:
1)从你的application.yaml中删除它(因为你可以为此设置一个JVM属性)
let inline callFunc (o:^T) a b =
(^T : (member func : string * string -> string) (o, a, b))
callFunc (MyClass()) "A" "B"
2)从每个配置文件特定的yaml文件中删除配置文件特定的标头。您不需要它,因为配置文件基于文件后缀,例如删除这个:
spring:
profiles:
active: @profileActive@
3)正如Oleg所说,只需用Dspring.profiles.active = Whatever运行你的任务