【问题标题】:Java load properties file correctlyJava 正确加载属性文件
【发布时间】:2014-12-09 02:08:37
【问题描述】:

我的项目结构如下:

ProjectName/src/java/com/main/Main.java

我在以下文件夹中有一个属性文件:

ProjectName/config/settings.properties

现在我尝试在 Main.java 中加载属性文件:

InputStream input = Main.class.getResourceAsStream("/config/settings.properties");
Properties prop = System.getProperties();
prop.load(input);

但这不起作用。怎样才是正确的做法?

编辑:我收到以下错误:

Exception in thread "main" java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Unknown Source)
    at java.util.Properties.load0(Unknown Source)
    at java.util.Properties.load(Unknown Source)

Edit2:现在它适用于 Eclipse。我做了以下(改编自getResourceAsStream() is returning null. Properties file is not loading

1) 此目录 [config] 必须放入“构建路径”。右键单击 Package Explorer 或 Project Explorer 视图中的目录,选择“Build Path”,然后选择“Use as Source Folder”。注意:此构建路径将是项目的类路径,当您运行它时。

2) 由于 config 目录现在是您的类路径的一部分并包含您的属性文件,您可以简单地使用 InputStream input = Server.class.getClassLoader().getResourceAsStream("settings.properties"); 加载它

这适用于 Eclipse,但不适用于 jar。我想我还必须以某种方式将构建路径添加到 ant 脚本中。

我该怎么做?

Edit3:如果我将 settings.properties 从 jar 中的 config 文件夹中取出,那么它可以工作。为什么?我也希望它在 jar 的配置文件夹中。

【问题讨论】:

  • 如果您能告诉我们您所面临的错误将会很有帮助。我们将能够为您提供更好的帮助。
  • 返回什么错误?
  • @afzalex 还是不行。
  • 输出为:C:\Users\myName\workspace\ProjectName。可能是配置不在类路径中的问题吗? IE。我的主类在 ProjectName/src/java.... 但我的配置在 ProjectName/config... 所以他们不共享 src 文件夹。
  • 对不起,我没有标明您使用Main 类作为参考。但考虑一下我的回答,我相信它会起作用。 (我删除了我的 cmets,因为我所说的关于调用类的事情不是在以类作为参考的情况下)。

标签: java classloader properties-file


【解决方案1】:

getResourceAsStream 在 jar 文件中查找相对编译的 (class) 文件。例子: 您编译的文件位于bin 目录中,而不是您应该将属性文件放入bin/config/settings.properties 以便访问它。

【讨论】:

  • 我用 ant 编译和构建 jar。在 jar 中,myjar.jar/java/com/main/Main.java 和 myjar.jar/config/settings.properties 末尾有以下结构。
  • 尝试将settings.properties 放到myjar.jar/java/config
【解决方案2】:

您正在使用 Maven。因此,请遵循 maven 结构并将您的资源(如 prop、xml 等文件)保存在 resource 文件夹中,然后调用。

所以文件夹结构应该是这样的

src/main/resource|
                 |
                  config|
                        |
                        settings.properties

InputStream input = Main.class.getClass().getResourceAsStream("/config/settings.properties");

【讨论】:

  • 我没用maven,我用ant编译生成jar。
  • 使用 InputStream 输入 = Main.class.getClass().getResourceAsStream("/config/settings.properties");我遇到了同样的错误。顺便说一句,我正在尝试让它在 eclipse 中运行而不是 jar,但我想同时使用 eclipse 和 jar 来运行它。
【解决方案3】:

使用以下:

InputStream input = Main.class.getResourceAsStream("../../../../config/settings.properties");
Properties prop = System.getProperties();
prop.load(input);

通过添加../,我在您的文件系统中后退了 1 步。在您的代码中,您使用的是/config.....,这意味着C:/config..... (如果它在C 驱动器中)

以下内容也适用于您的情况。 (但不在压缩文件中)

InputStream input = new FileInputStream("config/settings.properties");
Properties prop = System.getProperties();
prop.load(input);

【讨论】:

  • 您项目中的Server 是什么? Server.class.getClassLoader().getResourceAsStream("settings.properties"); 等价于 Server.class.getResourceAsStream("settings.properties");
  • 为什么你认为它可以在 jar 中工作,解释一下。 jar 文件将由 IDE 创建,它不会在 jar 文件中包含该配置文件夹。 IDE 将创建 ANT 指定的 jar 文件。你不应该把这些文件放在任何地方,src 文件夹是为你准备的。
  • 如果您仍然想按照自己的方式运行它,那么您可以添加properties 文件的类路径。但请记住,它不适用于其他计算机或未设置这些类路径的任何地方。而且我已经告诉过你使用了错误的方法
【解决方案4】:

三件事

  1. 您需要将 settings.properties 添加到 jar 中(可以与您的 Main 相同)
  2. 你的类路径应该包含这个 jar
  3. 您需要使用上下文类加载器在 Main 中加载属性文件。

类加载器 cl = Thread.currentThread().getContextClassLoader();

cl.getResourceAsStream("settings.properties");

【讨论】:

  • 您可以使用 include 添加到 ANT 中的类路径中 ------------------------------------------------ ----------------------------------
猜你喜欢
  • 1970-01-01
  • 2021-06-25
  • 2011-06-14
  • 1970-01-01
  • 2010-09-24
  • 2012-01-02
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多