java - maven项目中的资源和配置加载

标签 java maven resources classloader config

我正在使用 Maven 构建桌面应用程序。我读到了 Maven standard directory layout我现在有这个项目结构:

App
|-- pom.xml
`-- src
    |-- main
        |-- java
        |   `-- java classes
        |-- resources
        |   `-- images
        |       `-- app images
        `--config
           `--config.xml

我想找到一种方法来加载我的资源和配置文件。我阅读了一些文章和主题并发现了这个(我的代码中的简化示例):

//class for loading config
public class Preferences {
    public Preferences() {
        InputStream image = Preferences.class.getResourceAsStream("images/image.png");
        InputStream config = Preferences.class.getResourceAsStream("config.xml");
    }        
}

但是 image 和 config 变量包含 null。我正在尝试不同的加载变体(从根文件夹,使用 this.getClass() 而不是 Preferences.class 等),但它始终为空。我真的不了解这个资源加载系统,也没有找到任何关于它的好文档。如果有人对此机制给出一个很好的解释(或者只是在文档上提供链接),那就太好了。 因此,主要问题是:如何加载我的资源和配置文件?

最佳答案

getResourceAsStream()java.lang.Class方法可以像你做的那样使用,但是你必须在路径前加上/


这个问题很棘手。

1。两个同名方法

首先,在这两个类中存在两个同名同签名的方法:

java.lang.Class
java.lang.ClassLoader

它们具有相同的名称:getResource(String)(和 getResourceAsStream(String) 相似)。

2。他们接受不同格式的参数

然后,它们的参数有不同的格式:

  • 方法 java.lang.Class.getResouce<asStream>() 接受有和没有前导 / 的路径,导致不同的资源搜索策略。如果路径没有 / ,Java 将在 .class 文件所在的包/文件夹中搜索资源。如果它有 / ,Java 将从类路径根开始搜索。
  • 方法 java.lang.ClassLoader.getResource<asStream>() 只接受没有 / 的路径,因为它总是从类路径中搜索。在基于类路径的路径中,/ 不是有效字符。 *

    *:正如这个答案所说:this.getClass().getClassLoader().getResource("...") and NullPointerException

如何将文件夹添加到类路径?在 Eclipse 中,我们解析到项目的上下文菜单:“构建路径”-“配置构建路径...”并添加一些文件夹以构建路径。

3。说到 Maven

最后,如果一个项目是Maven项目,classpath中默认src/main/resources,所以我们可以使用

Class.getResource("/path-to-your-res");

或者,

ClassLoader.getResource("path-to-your-res");

,加载 src/main/resources 下的任何内容。

如果我们想添加另一个资源文件夹,正如您所提到的,它是在 pom.xml 中完成的。 它们也被添加到类路径中,由 Maven 完成。无需额外配置。

4。例子

比如你的config.inisrc/main/resources/settings下,myAvatar.gifsrc/main/images下,你可以这样做:

pom.xml 中:

<build>
    <resources>
        <resource>
            <directory>src/main/images</directory>
        </resource>
    </resources>
</build>

在代码中:

URL urlConfig = MyClass.class.getResource("/settings/config.ini"); //by default "src/main/resources/" is in classpath and no config needs to be changed.
InputStream inputAvatar = MyClass.class.getResourceAsStream("/myAvatar.gif"); //with changes in pom.xml now "src/main/images" is counted as resource folder, and added to classpath. So we use it directly.

我们必须使用上面的 /

或者,使用类加载器:

URL urlConfig = MyClass.class.getClassLoader().getResource("settings/config.ini"); //no leading "/"!!!
InputStream inputAvatar = MyClass.class.getClassLoader().getResourceAsStream("myAvatar.gif"); //no leading "/"!!!

关于java - maven项目中的资源和配置加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374235/

相关文章:

java - 为什么 jHipster 使用 oracle 12c 配置?使用oracle 11g配置有什么问题吗?

maven - 将 Artifact 部署到没有文件扩展名的Maven存储库

java - Selenium,Java - 如何使用文本单击元素?

java - java中如何为不同的数据库创建多个数据库连接

java - Jackson 多态反序列化字段错误

java - 无状态 ejb + jpa 的 junit 测试

C#:读取嵌入在资源文件中的文件内容

Android - ResourcesNotFoundException 试图通过资源 id 设置操作栏图标时

PHP - Foreach 循环和资源

java - 在java动物猜谜游戏中无法找到或加载主类