我知道这个问题已经被问过几次了,但是这些解决方案仍然无法解决这个问题。
我有一个Maven项目。还有一个位于consumer/src/main/java
中的Config.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"));
}
}
我一直得到nullpointer exception
。我知道那是因为找不到文件property_table.config.txt
。
首先,我将property_table_config.txt
文件与Config.java文件放在同一文件夹(consumer/src/main/java/
)中。并尝试使用/property_table_config.txt
和'property_table_config.txt`。他们都不工作。
然后我尝试使用绝对路径,但不起作用。并尝试使用/main/java/property_table_config
,但也不起作用。
然后,我看到了以下解决方案:https://stackoverflow.com/a/2103625/8159477。
因此,我创建了一个称为资源的目录,并将其放在主文件夹下(即,文件夹的路径为consumer/src/main/resources
,并在config
下创建一个子文件夹resources
。在将{{ 1}}文件中,我将代码更改为:
property_table_config.txt
但这仍然没有用。有人可以对此提供一些提示吗?任何建议将不胜感激!
答案 0 :(得分:0)
根据Class.getResourceAsStream
:
此方法委派给该对象的类加载器。如果此对象是由引导类加载器加载的,则该方法将委托给ClassLoader.getSystemResourceAsStream。
在委派之前,使用以下算法从给定的资源名称构造绝对资源名称:
- 如果名称以'/'开头('\ u002f'),则资源的绝对名称是名称中'/'之后的部分。
- 否则,绝对名称的格式如下:
modified_package_name/name
其中Modifyed_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...
或者,使用
this.getClass().getClassLoader()
.getResourceAsStream("property_table.config.txt")`
我已经通过类似的设置尝试了此操作,并且它按预期工作。
答案 1 :(得分:0)
ClassLoader().getResourceAsStream()
仅在类路径中查找文件。
您需要的是将配置文件放在类路径中的目录中。
因此,您有以下选择:
从命令行运行Java应用程序时,可以在-cp参数或CLASSPATH系统变量中设置目录的路径。要点是:您需要从中获取配置文件的目录必须位于类路径中,而不是文件中。 (例如,如果文件位置为c:\my_projects\test-project\config\my_config.properties
并且c:\my_projects\test-project\
在类路径中,则getResourceAsStream
的调用将为ClassLoader().getResourceAsStream("config/my_config.properties")
您可以将文件打包到jar文件中,而jar文件的根目录是getResourceAsStream("config/my_config.properties")
如果您的Maven项目是jar项目,则需要使用Maven资源插件将其他资源放入jar。
顺便说一句:Maven不会将任何内容放入src / main / java /目录的jar文件中(如果您没有为资源插件明确指定它的话)
如果在Maven项目中使用类似Eclipse的IDE,则src / main / resources是构建类路径的一部分。仔细检查是否存在,如果没有,请执行“更新Maven项目”或手动添加。
仅当您在IDE中运行项目而不是从独立的Jar文件中运行时,如果没有打包文件或未在classpath中提供位置,ClassLoader仍然会从src / main / resources文件夹中看到属性文件。
答案 2 :(得分:-1)
您可以尝试以下代码吗?
Config.class.getResourceAsStream(“ property_table.config.txt”)
更新: 这是我尝试的代码。
package test;
import java.util.Properties;
public class Config
{
Properties configFile;
public Config()
{
configFile = new Properties();
try
{
configFile.load(Config.class.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"));
}
}
然后我将property_table.config.txt文件放入测试包中,并且可以正常工作。