在jar之外的ResourceBundle文件

时间:2018-03-22 09:28:06

标签: java spring-boot configuration

我有一个/resources/application.properties的春季启动应用程序,部署时,jar旁边有一个application.properties(以及其中的一个)。

代码中的某处我使用ResourceBundle.getBundle("application").getString("x")但总是返回jar内属性中定义的值。

我的目标是从外部文件中获取值,如果不存在,那么我需要从jar中获取值。就像默认的弹簧行为一样,但我无法实现这一点。

编辑:

您可以在下面的正确答案中使用解决方案,也可以依靠弹簧Environment自动装配并使用getProperty()

1 个答案:

答案 0 :(得分:1)

ResourceBundle.getBundle(String baseName)依赖于类加载器,而不是直接依赖文件系统来查找资源 这相当于调用重载的:

getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader()), 

所以你的结果是预料之中的 你要找的是PropertyResourceBundle 要创建一个实例,您需要ReaderInputStream

您可以加载外部和内部文件。

ResourceBundle internalProps = ResourceBundle.getBundle("application");
ResourceBundle externalProps = new  PropertyResourceBundle(Files.newInputStream(Paths.get("application.properties"));

你可以在第一个意图中使用外部ResourceBundle,在第二个意图中使用第二个意图。