Java maven项目中的资源和配置加载
我正在使用Maven进行桌面应用。我读过,现在我有了这个项目结构:Java maven项目中的资源和配置加载,java,maven,resources,classloader,config,Java,Maven,Resources,Classloader,Config,我正在使用Maven进行桌面应用。我读过,现在我有了这个项目结构: App |-- pom.xml `-- src |-- main |-- java | `-- java classes |-- resources | `-- images | `-- app images `--config `--config.xml 我想找到一种加载资源和配置
App
|-- pom.xml
`-- src
|-- main
|-- java
| `-- java classes
|-- resources
| `-- images
| `-- app images
`--config
`--config.xml
我想找到一种加载资源和配置文件的方法。我阅读了一些文章和主题,发现了以下内容(代码中的简化示例):
但是image和config变量包含null。我尝试了不同的加载变体(从根文件夹,使用这个.getClass()而不是Preferences.class和其他),但我总是使用null。我真的不了解这个资源加载系统,也没有找到任何关于它的好文档。如果有人能很好地解释这个机制(或者只是在文档上提供一个链接),那就太好了。
因此,主要的问题是:如何加载资源和配置文件 使用此方法如何:
InputStream file = ClassLoader.getSystemResourceAsStream("res.txt");
或
正如您现在看到的,它将在类路径顶部查找MyProperty.properties文件。可能位于src/main/resources目录或其他src文件夹中——这取决于应用程序(jar/war)的构建方式
如果您正在构建一个jar,那么您应该能够解压缩它,并在jar的顶层查看您的属性文件。如果您正在构建一个war,那么它可能应该位于WEB-INF/classes目录中。同样,这取决于它是如何建造的。我想我找到了解决方案。正如Juned Ahsan和mR_fr0g所写,我需要使用ClassLoader类,而不是这个.getClass().getResource()。但是,它仅适用于资源文件夹。但是maven允许添加其他文件夹作为资源文件夹。我只需要将此部分添加到pom.xml中:
public Preferences() {
InputStream image = this.getClass().getClassLoader().getResourceAsStream("image.png");
InputStream config = this.getClass().getClassLoader().getResourceAsStream("config.xml")
}
<build>
<resources>
<resource>
<directory>src/main/config</directory>
</resource>
</resources>
</build>
尝试在之前构建项目。
如果您只是将文件放在resources文件夹中,那么您需要构建项目,以便将新的资源文件复制到目标文件夹中您可以使用
java.lang.Class
的getResourceAsStream()
方法,但您必须在路径之前添加/
。
这个问题很棘手 1.两个同名的方法 首先,在这两个类中存在两个名称相同、签名相同的方法:
java.lang.Class
java.lang.ClassLoader
它们的名称相同:getResource(String)
(而getresourceastream(String)
是相似的)
2.它们接受不同格式的参数
然后,它们的参数有不同的格式:
- 方法
java.lang.Class.getResource
src/main/resources
位于类路径中,因此我们可以使用
Class.getResource("/path-to-your-res");
或者
,以加载src/main/resources
下的任何内容
如您所述,如果我们想添加另一个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.getClassLoader().getResource("settings/config.ini"); //no leading "/"!!!
InputStream inputAvatar = MyClass.class.getClassLoader().getResourceAsStream("myAvatar.gif"); //no leading "/"!!!
这是一个老问题,但我发现您需要使用include标记集,否则在您调用时它将找不到资源
ClassLoader.getSystemResource("config.xml").
我正在JDK14上使用最新的maven(2020年10月)
这里是工作xml。希望它有帮助,因为我在这里的解决方案中尝试了它,直到我的xml如下所示,它才起作用
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<!-- or whatever other file extensions you want to include -->
</includes>
</resource>
</resources>
</build>
src/main/resources
**/*.xml
只是一个小小的旁注,通过向您的资源中添加配置,maven会将其视为一种资源。因此,它也将包含在已编译的JAR中,这可能是您不想对配置文件执行的操作。@Erwin,那么如何在不将配置目录设置为资源目录的情况下从配置目录中读取呢?
<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 "/"!!!
ClassLoader.getSystemResource("config.xml").
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<!-- or whatever other file extensions you want to include -->
</includes>
</resource>
</resources>
</build>