正在执行的类的文件系统路径获取

74

有没有办法在运行时从执行java命令的类的代码中确定当前执行类的文件系统位置?

例如,对于以下类:

public class MyClass{
 public static void main(String[] args){\
   new MyClass().doStuff();
 }

 private void doStufF(){
   String path = ... // what to do here?!
   System.out.println("Path of class being invoked: " + path);
 }

}
有没有办法获取和打印MyClass.class文件在文件系统中被调用的正确路径? 同样地,如果我从java -jar命令调用jar文件,有没有办法从该jar内部的类中获取jar文件的路径? P.S .:请不要假设从哪个工作目录调用了java命令!
1个回答

119
以下的代码片段将为您完成此操作:
final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());

用你的main类替换MyClass

File对象f代表被执行的.jar文件。您可以使用此对象获取父目录以查找包含.jar文件的目录。


7
当进行这项操作时请注意:如果您的类文件存放在一个包含空格的文件夹中,返回的字符串(它是URL的路径部分,由getLocation()返回,并且已被URL编码)将包含'%20'而不是空格! - Jan de Vos
2
@JandeVos 使用 File(java.net.URI) 构造函数似乎可以解决这个问题。 - Spooky
1
@Spooky的评论:所以它必须是final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getURI().getPath()); - Andreas Covidiot
1
我正在尝试这个,但它返回的是我运行命令的文件夹路径,而不是包含类文件的子文件夹。 - Spencer Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接