如何获取当前执行的 jar 文件所在的目录? [复制]

Posted

技术标签:

【中文标题】如何获取当前执行的 jar 文件所在的目录? [复制]【英文标题】:How do I get the directory that the currently executing jar file is in? [duplicate] 【发布时间】:2011-02-19 16:54:09 【问题描述】:

我在不同的位置运行一个 jar 文件,我试图弄清楚如何获取正在运行的 jar 文件的位置。

【问题讨论】:

最好的选择是:String path = new File(".").getCanonicalPath().toString(); 【参考方案1】:

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

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

【讨论】:

不完美?这实际上是最可靠的,因为其他提议的建议返回 当前工作目录,它本身并不是 JAR 所在的文件夹。例如。如果您先执行cd /somefolder,然后执行java -jar /otherfolder/file.jar,则其他建议将返回/somefolder。 +1。 所以这个解决方案实际上会返回/otherfolder? 并不总是可以确定封闭 JAR 的位置(类加载器可以使用任何东西进行存储,而不仅仅是文件系统),但是当它是时,this 是这样做的方法。 +1 我的 IDE 玩得太久了 对我来说它返回包括 program.jar 名称【参考方案2】:

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

new File(".").getAbsolutePath()

【讨论】:

正如@Will Hartung 所说,“当前目录很可能与执行jar 所在的位置无关。” 还有比这更小的代码。 new File("").getAbsolutePath();【参考方案3】:

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

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;

【讨论】:

你可以使用 URLDecoder.decode(directoryPath, "UTF-8");用空格替换 %20 你也可以使用 absolutePath.lastIndexOf(File.separator) 来支持所有操作系统【参考方案4】:

考虑以下函数

 //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];
        

【讨论】:

【参考方案5】:

这似乎是一个不确定的问题。

如果我在 Java 中运行代码,它会用完 rt.jar 并且可能还有十几个其他 jar。

最先运行的文件实际上是在 rt.jar 中,rt.jar 它调用你的 main.jar。

如果您编写的类允许您告诉您正在运行的 jar 并且该类被移动到不同的 jar 中,那么您将不再“用尽”包含您的 main 的 jar。

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

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

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

【讨论】:

好点,我们的应用程序被包装在一个巨大的罐子里(不幸的是)。

以上是关于如何获取当前执行的 jar 文件所在的目录? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

linux shell脚本如何获取“当前工作路径”,“执行脚本所在路径”,“执行脚本所在路径和执行路径的相对路径”?(当前目录脚本目录脚本路径)

linux shell脚本如何获取“当前工作路径”,“执行脚本所在路径”,“执行脚本所在路径和执行路径的相对路径”?(当前目录)

执行java可执行文件(.exe)时如何获取CMD的目录[重复]

java获取当前执行文件的路径

C#获取本执行程序所在的当前路径

调用shell脚本时,获取脚本的当前目录