问题
最近在用java开发一个工具时发现一个问题,用Eclipse编译运行java代码,可以通过以下代码得到path。但当我将程序达成jar包,直接在终端运行时,获取path报空指针错误。
public String getClassPath(Class pClass){
String iPath = pClass.getClassLoader().getResource("").getPath();
System.out.println( "拿到的classpath:" + iPath );
return iPath;
}
之前猜测是Eclipse在编译运行时动了手脚,但后来发现并非如此。而是,使用getResource(""),注意,此处参数是空字符串哦,运行代码的方式不同会导致java对它有不同的处理。
情况一
运行编译后的程序(非Jar包形式),XXX.class.getClassLoader().getResource("")能正常得到path
情况二
运行编译后的程序(Jar包形式),XXX.class.getClassLoader().getResource("")得到的是null
eclipse编译代码后,直接运行编译后的文件,并非达成jar包再运行,所以不会出现取null的情况。
解决
如果想非jar包方式和jar包方式都能成功取到路径,应使用以下方式获取文件路径,明确指定入口类的包和类名,如:
// per/ying/dm是包名
String iPath = ClassLoader.getSystemClassLoader().getResource("per/ying/dm/XXX.class").getPath();
结果
情况一
运行编译后的程序(非Jar包形式),XXX.class.getClassLoader().getResource("per/ying/dm/MigrationMain.class")得到的是
file:/C:/项目名/out/per/ying/dm/XXX.class
情况二
运行编译后的程序(Jar包形式),XXX.class.getClassLoader().getResource("per/ying/dm/MigrationMain.class")得到的是
jar:file:/C:/项目名/out/per/ying/dm/XXX.class