“当前目录”中的Spring引导外部属性文件将被忽略

时间:2016-11-30 17:01:31

标签: java tomcat spring-boot properties-file externalizing

from the manual:

  

24.3应用程序属性文件SpringApplication将从以下位置的application.properties文件加载属性并添加   他们到春天的环境:

     

当前目录的A / config子目录。

     

当前目录

     

classpath / config包

     

类路径根

它提到当前目录两次,但这并不意味着什么:

我尝试将它放在我的项目的根目录中(即在srcjava.io.File( "." ).getCanonicalPath()的输出匹配的文件夹中的System.getProperty("user.dir");以上),我尝试将它与战争放在一起文件(即build\libs

但唯一能让它真正起作用的地方是默认位置(src\main\resources)。

那么“当前目录”甚至意味着什么?这些文件到底在哪里?

我需要找到文件的正确外部位置,这样我就不必在应用程序中构建数据库凭据。

指南说将application.properties放在当前目录中会起作用,我找到了确切的当前目录,但它仍然不起作用,我可以通过以下输出验证:{{1} } System.out.println(System.getProperty("spring.datasource.url"));它仅使用嵌入的属性文件输出正确的值。

5 个答案:

答案 0 :(得分:2)

根据ConfigFileApplicationListener

// Note the order is from least to most specific (last one wins)
private static final String DEFAULT_SEARCH_LOCATIONS =
       "classpath:/,classpath:/config/,file:./,file:./config/";

file:./解析到启动java进程的工作目录。

答案 1 :(得分:2)

我同意Stephane Nicoll的论点,即我们通常不需要这个用于开发和测试,但需要用于生产,其中属性文件通常是外部化的,并且不使用源代码中存在的文件。这对我有用,

java -jar myjar.jar --spring.config.location=file:D:\\RunRC\\application.properties

目录 - D:\\RunRC - 上面命令中提到的是我机器上的示例。

我继续使用源代码的属性文件,即来自\src\main\resources\的开发和测试,但在生产中,我注释掉条目,如果我从D:\\RunRC开始我的jar或战争,那么我提供当前目录,如上面的java命令和保留属性文件所示。

只是做 - @PropertySource({ "application.properties"})@PropertySource({ "file:application.properties"})不会从保存jar或war的目录中提取它。

对于数据库凭据,我建议使用特定于操作系统的环境变量并使用类似于 - @PropertySource({"file:${CONF_DIR}database.properties" })的语法,其中CONF_DIR是指向该目录的现有环境变量。

希望它有所帮助!!

答案 2 :(得分:0)

我知道当前目录是项目的根目录。但是,您可以使用-Dspring.config.location=your/config/dir/更改此设置。 看看这篇文章enter link description here

答案 3 :(得分:0)

如果您搜索"当前目录java",您最终会here with this question。目的是如果您将application.properties放在与应用程序相同的目录中,则默认情况下会将其选中。

您不会在开发或测试中使用该功能,因为您不应该依赖该功能。但是,在生产中运行应用程序时,将特定于环境的设置放在应用程序本身旁边的配置文件中可能会很方便。

答案 4 :(得分:0)

当前目录指的是我们执行jar的位置。通过Spring Boot maven插件创建一个可执行jar,并将jar.properties放在jar文件旁边即可。例如:here