Java:如何从资源文件夹加载.properties?

时间:2015-08-08 02:39:10

标签: java maven

我在IntelijWorkspace中有Manven项目,在/resources文件夹中,我添加了一个名为.properties的{​​{1}}文件。现在,我试图从Java获取此文件,它总是抛出SBMessages.properties。    下面是我项目的树:

enter image description here

我的代码是在SBConnector.class中获取.properties文件:

FileNotFoundException

尝试调试,路径指向public void initialize() { SBMessages = new Properties(); try { SBMessages.load(getClass().getResourceAsStream("/sb/elements/SBMessages.properties")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 而不是/target/classes/elements/SBMessages.properties

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:4)

不同的框架提供不同的类加载器。你可能有你正在使用的JRE的“默认”类加载器。它将遵循JDK文档。你可能会遇到这个页面:  http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) 但更有用的页面是这一个:  http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String) 实际上,你可以用斜杠开始你的资源名称。

尽管有这些文档,但您的类加载器可能不遵循这些规则。多么令人失望。因此,有三种形式可供尝试:

  1. 绝对以斜线开头。
  2. 绝对没有起始斜线。
  3. 亲戚没有任何斜线。
  4. 除了这三种形式之外,您还必须在正确的类上调用getResourceAsStream()。该类应该与保存属性文件的jar文件位于同一个jar文件中。这可能令人困惑,所以你从一个简单的例子开始是一件好事。 : - )

    像我一样为我工作:

    public static void main(String[] args) {
        new NewMain().doit();
    }
    
    public void doit() {
        Properties prop = new Properties();
        try (InputStream inputStream = NewMain.class.getResourceAsStream("/data/newproperties.properties")) {
    
            prop.load(inputStream);
            System.out.println("hello " + prop.getProperty("x", "default"));
    
        } catch (FileNotFoundException e) {
            e.printStackTrace(System.out);
        } catch (IOException e) {
            e.printStackTrace(System.out);
        }
    
    }
    

答案 1 :(得分:2)

所以你没有使用standard directory layout,希望这是有充分理由的,否则我建议你这样做。 现在,您的/resources文件夹无法识别为需要添加到类路径的文件夹。 (您可以通过看到/target/classes/sb/elements/SBMessages.properties不存在来确认这一点)您可以将其配置为http://maven.apache.org/pom.html#Resources描述,但同样可能更适合每个人坚持默认目录布局,它会减少配置很多。