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