几天后,我一直试图让我的Java项目从位于其JAR文件中的文件加载一些属性。但是,在尝试加载文件时,我经常会得到一个空指针。
文件夹层次结构在/ data中包含属性文件,在/ emp / ** / **中包含所有源文件...
Properties defaultProps = new Properties();
try {
InputStream in = getClass().getClassLoader().getResourceAsStream("data/build_info.properties");
//InputStream in = new URL("file:data/build_info.properties").openStream();
defaultProps.load(in);
in.close();
} catch (FileNotFoundException e) {
//e.printStackTrace();
} catch (IOException e) {
//e.printStackTrace();
} catch (NullPointerException e){
Log.E("NPE- Properties not loaded", "properties");
revision = "Properties file not found";
}
if (defaultProps.getProperty("build.major.number") == null) {
Log.W("Properties not loaded", "properties");
revision = "Properties file not found";
} else {
Log.V("Properties Loaded Successfully", "properties");
revision = "Version: " + defaultProps.getProperty("build.major.number")
+ "." + defaultProps.getProperty("build.minor.number") + " "
+ "Revision: "
+ defaultProps.getProperty("build.revision.number");
}
答案 0 :(得分:3)
如果data
位于jar的根目录中,并且build_info.properties
位于jar中的数据目录中,并且jar位于类路径中,那么getClass().getClassLoader().getResourceAsStream("data/build_info.properties");
将会找到那个属性文件。您也可以使用getClass().getResourceAsStream("/data/build_info.properties");
。
如果getClass()
返回由类加载器加载的类不同于在类路径上具有jar的类,则会出现特殊情况。
答案 1 :(得分:1)
您也可以尝试 -
Thread.currentThread().getContextClassLoader().getResourceAsStream("data/build_info.properties");
答案 2 :(得分:0)
我遇到了一个死机简单的控制台应用程序的问题。最后我在https://stackoverflow.com/a/1464541/1792291找到了一个提示,我将我的控制台应用程序变成了一个摇摆应用程序,突然一切都运转了。
上面链接中的解释确实有一定道理:由于控制台应用程序在创建shell时获取其属性(包括CLASSPATH),因此它不会知道在JVM期间/ for /中定义的类路径。 / p>