我正在使用 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.ini
在src/main/resources/settings
下,myAvatar.gif
在src/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/