覆盖.jar库中包含的.properties文件

时间:2015-02-01 12:00:50

标签: java maven properties jar override

我很难找到一个不依赖于Spring或类似东西的答案。

我维护一个Java库,它提供远离服务器的抽象,这个库是使用maven构建的。为了定义连接细节(当前是硬编码的),我想引入.properties文件以便于自定义,但是我想在.jar本身内提供合理的默认值,但允许人们在必要时覆盖特定的属性

我现在的maven结构是这样的......

src/java/com/site/package/cfg/MyLibraryConfig.java
src/resources/com/site/package/cfg/MyLibraryConfig.properties

我目前正在使用MyLibraryConfig类中的getResourceAsStream("MyLibraryConfig.properties")来加载属性文件,而且工作正常。

有没有办法让人们使用我的.jar将文件(例如MyLibraryConfigOverride.properties)放在我的.jar之外,然后将其拾取并使用?我只希望它们覆盖他们想要的特定属性,而不是整个文件。例如,更改服务器主机名但使用所有标准端口是很正常的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我想我不会尝试覆盖文件,而是硬编码设置我的默认值并提供通过可选文件覆盖这些默认值的可能性,如:

Properties data = new Properties();
data.setProperty("a", "sensitive default");
InputStream in = getClass().getResourceAsStream("MyLibraryConfig.properties");
if (in != null) {
  data.load(in);
  in.close();
}

但是,如果您愿意,当然您也可以将默认值放在文件中。在这种情况下,只使用不同的名称。像这样:

Properties data = new Properties();
InputStream defaults = getClass().getResourceAsStream("defaults.properties");
data.load(defaults);
defaults.close();
InputStream overwrites= getClass().getResourceAsStream("overwrites.properties");
if (overwrites!= null) {
  data.load(overwrites);
  overwrites.close();
}

这增加了额外的复杂性,你必须决定这是否会为你付出代价。