【问题标题】:Read config file from classpath in Java with default in JAR从 Java 中的类路径读取配置文件,在 JAR 中使用默认值
【发布时间】:2014-03-03 20:43:01
【问题描述】:

更新:事实证明,在我进行的一些测试中,IDE 中的类路径设置不正确。下面的 sn-p 可以正常工作。这不再是问题。

我正在尝试在将部署在 JAR 中的文本文件中设置一些属性/配置。

我希望用户能够提供他们自己的属性/配置文件,该文件将覆盖 JAR 中使用的文件,因此只有在用户提供的文件不存在时才会使用 JAR 中的文件。

我正在使用 Class.getResource(path),它应该能够找到相对和绝对(带有前导斜杠)文件。

给定 JAR 中的以下文件层次结构:

<jar-file>/SomeClass.class
<jar-file>/conf/config-file.txt

和一个可选文件

<some-classpath-folder>/conf/config-file.txt

我正在尝试执行类似下面的 sn-p 的操作,这样只有在类路径的绝对文件夹 conf 中找不到该文件时,才会从 JAR 内的相对 conf 文件夹中加载该文件:

Class clasz = SomeClass.class;
res = clasz.getResource("/conf/config-file.txt");    // absolute file not found, note leading-slash

if (res == null)
    res = clasz.getResource("conf/config-file.txt"); // relative file is found, No leading-slash

找到了相对文件(来自 JAR),但没有找到来自类路径的绝对文件。

调用 System.getProperty("java.class.path") 显示 文件夹,因此看起来类路径设置正确,但 / 中的文件conf/config-file.txt 没有找到。

有没有办法知道在搜索文件时扫描了哪些文件夹?或者对这里出了什么问题有什么建议?

TIA

【问题讨论】:

    标签: java properties classloader properties-file


    【解决方案1】:

    如果您完全依赖类路径资源,您将受到类路径层次结构、程序运行方式等的支配。这可能有效,但并不完全在您的控制范围内。

    IMO 最好检查明确定义的路径,例如,通过 -Dconfig=/path/to/config 等系统属性、用户家中的文件等已知位置或属性 API。

    【讨论】:

    • 我计划为文件提供唯一的名称,这样这不应该是 IMO 的问题。我试图将外部配置保持在最低限度,这将在 Servlet 过滤器中使用,所以我想避免 user.home 等。我将用更多细节更新问题。谢谢。
    • @Igal 如果这是在 Web 应用程序中,并且您希望在不修改 Web 应用程序的情况下拥有用户可配置的选项,您仍应使用外部文件进行额外配置,IMO。或 JNDI/等。
    • 我将研究 JNDI,但请查看我在问题中的更新,在我看来,如果我可以让它工作,它应该是一个简单的解决方案。谢谢。
    • @Igal 问题是 没有为你的应用设置类路径,无论谁使用 app :不管它作品不在你的掌控之中。不将类路径用于用户定义的事物要可靠得多,但您可以随心所欲地进行操作。
    • 我知道你的建议会让它更可靠,但我想提供适用于 99% 情况的默认配置,允许高级用户覆盖配置,所以高级用户会知道类路径文件夹是什么。问题是在 IntelliJ 内部的测试中,我可以找到相对文件,但找不到绝对文件。任何想法为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2017-01-04
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多