Java 如何获取当前正在执行的jar文件所在的目录?

Java 如何获取当前正在执行的jar文件所在的目录?,java,jar,Java,Jar,我在不同的位置运行jar文件,并试图找出如何获取正在运行的jar文件的位置。不是一个完美的解决方案,但这将返回类代码库的位置: getClass().getProtectionDomain().getCodeSource().getLocation() 如评论中所述,这不是对问题的直接回答,但实际上可能是许多人正在寻找的(执行代码的当前目录): 这似乎是一个难以回答的问题 如果我在Java中运行代码,那么rt.jar和其他十几个jar都快用完了 第一个运行的文件实际上是在rt.jar中,rt.

我在不同的位置运行jar文件,并试图找出如何获取正在运行的jar文件的位置。

不是一个完美的解决方案,但这将返回类代码库的位置:

getClass().getProtectionDomain().getCodeSource().getLocation()

如评论中所述,这不是对问题的直接回答,但实际上可能是许多人正在寻找的(执行代码的当前目录):


这似乎是一个难以回答的问题

如果我在Java中运行代码,那么rt.jar和其他十几个jar都快用完了

第一个运行的文件实际上是在rt.jar中,rt.jar调用您的main

如果您编写了一个类,该类允许您告诉您正在运行的jar,并且该类被移动到另一个jar中,那么您就不再“耗尽”包含main的jar了

我认为您需要的是启动应用程序的命令行,但是如果您首先CD到目录,那么它可能没有到jar的完整路径

另外,您可能不是从jar运行的——有人可能已经将您的jar扩展到目录中的类中,并以这种方式运行它


就我个人而言,我只是将您的程序包装在一个shell脚本启动器中,您可以查看当前位置和jar文件的位置,然后将它们传递到java中。

考虑以下函数

 //This method will work on Windows and Linux as well.    
     public String getPath(){
        URL rootPath = getClass().getResource("");
        String URI=rootPath.toString().substring(9);
        String[] currentPath=URI.split("myjar.jar!");
        currentPath[0]=currentPath[0].replaceAll("%20"," ");
        return currentPath[0];
        }

下面是我从任何地方获取执行路径的方法

private static String GetExecutionPath(){
    String absolutePath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
    absolutePath = absolutePath.substring(0, absolutePath.lastIndexOf("/"));
    absolutePath = absolutePath.replaceAll("%20"," "); // Surely need to do this here
    return absolutePath;
}

不完美?这实际上是最可靠的,因为其他建议返回的是当前工作目录,它本身不是JAR所在的文件夹。例如,如果您使用
cd/somefolder
,然后使用
java-jar/otherfolder/file.jar
,则其他建议将返回
/somefolder
+1.所以这个解决方案实际上会返回
/otherfolder
?并不总是能够确定封闭JAR的位置(类加载器可以使用任何东西来存储,而不仅仅是文件系统),但当它是时,这就是实现它的方法。+1我对我来说,我的IDE太长了,它返回的包括program.JAR名称。@will Hartung说,“当前目录很可能与执行jar的位置无关。”比这小得多的代码<代码>新文件(“”).getAbsolutePath()很好,我们的应用程序被包装在一个巨大的jar中(不幸的是);要用space替换%20,还可以使用absolutePath.lastIndexOf(File.separator)来支持所有操作系统。最佳选择是:
String path=new File(“.”).getCanonicalPath().toString()
private static String GetExecutionPath(){
    String absolutePath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
    absolutePath = absolutePath.substring(0, absolutePath.lastIndexOf("/"));
    absolutePath = absolutePath.replaceAll("%20"," "); // Surely need to do this here
    return absolutePath;
}