Spring不接受环境变量

时间:2019-03-11 13:57:52

标签: java spring maven spring-boot

在我的项目中,每个环境下都有单独的application.yml文件,每个环境下的文件夹内

one yml file for each env

注意:下面临时制作了红色yml文件,以使代码正常工作。但应在固定后将其移除。所以我要根据环境使用单独的application.yml文件。 特别是我需要使用local / application.yml进行本地开发

下面有一个在我的项目中获取env变量的示例

@Component
@Configuration
public class ApplicationProperties {
    @Value("${ex.my.url}")
    private String myServiceUrl;
   // getters setters and nedded stuff
}

但是它不起作用,因为找不到找到所需环境的方法。因为它在单独的文件夹中。所有其他示例都提到了在资源文件夹中获取yml文件的方法,无需单独的文件夹。

该问题有解决办法吗?

4 个答案:

答案 0 :(得分:0)

在我的项目中,我使用VM选项指定一个配置文件: -Dspring.profiles.active = local

然后我有一个名为application-local.yml的文件

在生产中: -Dspring.profiles.active = prod,将使用文件application-prod.yml

答案 1 :(得分:0)

在资源文件夹中

根据需要创建application.yml,application-local.yml,application-dev.yml等文件

然后在application.yml

 spring.profile.active = ${ENV}

现在在运行期间在Intellij下从运行/调试配置中指定ENV变量,或者在application.yml中提及要为其构建jar的配置文件。

或者,您可以使用-D spring.profile.active = dev

答案 2 :(得分:0)

首先,从documentation

  

SpringApplication在以下位置从application.properties文件加载属性,并将其添加到Spring Environment:

     
      
  1. 当前目录的/ config子目录
  2.   
  3. 当前目录
  4.   
  5. 类路径/ config包
  6.   
  7. classpath根
  8.   

因此,通过传递的目录层次结构,您会遇到问题。

第二,对于文件说明,可以使用Profiles。其工作原理如下:

  • 如果未指定配置文件-将使用application.properties
  • 对于任何其他配置文件,也将使用名称为application-<name>.properties的配置文件

因此,如果您指定devcool配置文件,则属性application.propertiesapplication-dev.properties和`application-cool.properties将被使用

更新:

您可以传递spring.config.location来指定属性文件的路径,但是如果您希望拥有目录层次结构,则需要使用context.initializers.classesApplicationContextInitializer

进行一些自定义

答案 3 :(得分:0)

经典的解决方案是设置一个配置文件 (我更喜欢房地产,因为我很理智) 并允许将覆盖文件放置在每个已安装的主机上。

Spring支持开箱即用。

这里是一个例子:

public static void main(final String[] argumentArray)
{
  final StringApplicationBuilder springApplicationBuilder;

  springApplicationBuilder = new SpringApplicationBuilder(YourSpringBootApplication.class)

  springApplicationBuilder.properties(
    "spring.config.location=classpath:/yourConfig.properties,/some/path/to/overrides/directory/yourConfig.properties");

  springApplicationBuilder.build().run(argumentArray);
}