【问题标题】:Override a .properties file contained within a .jar library覆盖 .jar 库中包含的 .properties 文件
【发布时间】:2015-03-31 11:55:54
【问题描述】:

我正在努力寻找一个不依赖于 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 之外,然后拾取并使用该文件?我只希望他们覆盖他们想要的特定属性,而不是整个文件。例如,更改服务器主机名但使用所有标准端口是很正常的。

感谢您的帮助。

【问题讨论】:

  • 是的,当您加载覆盖的属性时,您将获得另一个输入流,并且您可以从中获取所有属性,类似于您在 MyLibraryConfig 属性中的属性。并发布您可以决定要覆盖的属性和不覆盖的属性。

标签: java maven properties jar overriding


【解决方案1】:

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

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();
}

这增加了额外的复杂性,您必须决定这是否会为您带来回报。

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2015-01-10
    • 2014-08-25
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多