我知道这个问题已经被问过好几次了,但我仍然无法通过这些解决方案来解决它。
我有一个 Maven 项目。一个 Config.java 文件位于consumer/src/main/java. 以下是内容:
import java.util.Properties;
public class Config {
Properties configFile;
public Config() {
configFile = new Properties();
try {
configFile.load(this.getClass().getClassLoader().
getResourceAsStream("property_table.config.txt"));
} catch(Exception e) {
e.printStackTrace();
}
}
public String getProperty(String key) {
String value = this.configFile.getProperty(key);
return value;
}
public static void main(String[] args) {
Config config = new Config();
System.out.println("URL: " + config.getProperty("URL"));
System.out.println("PASSWORD: " + config.getProperty("PASSWORD"));
}
}
Run Code Online (Sandbox Code Playgroud)
我不断得到nullpointer exception。我知道那是因为它找不到文件property_table.config.txt。
起初,我将property_table_config.txt文件放在与consumer/src/main/java/Config.java 文件相同的文件夹中()。并尝试使用/property_table_config.txt和'property_table_config.txt`。它们都不起作用。
然后我尝试使用绝对路径,不起作用。并尝试使用/main/java/property_table_config,也不起作用。
然后我看到了这个解决方案:https : //stackoverflow.com/a/2103625/8159477。所以我创建了一个名为resources的目录放在主文件夹下(即文件夹的路径是consumer/src/main/resources,并config在下创建一个子文件夹resources。将property_table_config.txt文件放在那里后,我将代码更改为:
configFile.load(this.getClass().getClassLoader().getResourceAsStream("/config/property_table.config.txt"));
Run Code Online (Sandbox Code Playgroud)
但这仍然没有奏效。任何人都可以对此提供一些提示吗?任何建议将不胜感激!
根据Class.getResourceAsStream:
此方法委托给此对象的类加载器。如果此对象由引导类加载器加载,则该方法委托给 ClassLoader.getSystemResourceAsStream。
在委托之前,使用以下算法从给定的资源名称构造一个绝对资源名称:
- 如果名称以“/”(“\u002f”)开头,则资源的绝对名称是“/”后面的名称部分。
- 否则,绝对名称采用以下形式:
modified_package_name/name
其中, modified_package_name 是此对象的包名称,用“/”代替“.”。('\u002e')。
我是这样理解评论的:
ClassLoader.getResourceAsStream,则从包根发送绝对路径,但省略第一个/.Class.getResourceAsStream,请发送相对于当前Class对象的路径(并且该方法将考虑包),或者发送从包根目录开始的绝对路径,以/.但除此之外,您还需要了解您的构建系统。使用 maven,资源文件存储在src/main/resources.
因此,在您的情况下,我认为进行以下更改应该可以解决问题:
src/main/resources.将代码更改为
this.getClass()
.getResourceAsStream("/property_table.config.txt")
//or `Config.class.getResource...
Run Code Online (Sandbox Code Playgroud)或者,使用
this.getClass().getClassLoader()
.getResourceAsStream("property_table.config.txt")`
Run Code Online (Sandbox Code Playgroud)我已经用类似的设置尝试过这个,它按预期工作。
| 归档时间: |
|
| 查看次数: |
8106 次 |
| 最近记录: |