在java中获取当前用户路径而不是应用程序路径

在java中获取当前用户路径而不是应用程序路径,java,file,command-line,java-io,filepath,Java,File,Command Line,Java Io,Filepath,我试图在一个具有多个依赖项的大型命令行应用程序中获取当前用户路径。每一次都是。使用时,它会给出jar所在的应用程序路径,而不是调用的当前用户路径 因此,当运行此命令时: File file = new File("."); System.out.println(file.getCanonicalPath()); 提供应用程序所在的路径 但是当我创建一个单独的小应用程序并使用相同的代码时。从不同的目录调用jar,它给出当前用户路径 我对命令行参数使用JSAP命令行解析器,其作用方式相同。如何解决

我试图在一个具有多个依赖项的大型命令行应用程序中获取当前用户路径。每一次都是。使用时,它会给出jar所在的应用程序路径,而不是调用的当前用户路径

因此,当运行此命令时:

File file = new File(".");
System.out.println(file.getCanonicalPath());
提供应用程序所在的路径

但是当我创建一个单独的小应用程序并使用相同的代码时。从不同的目录调用jar,它给出当前用户路径

我对命令行参数使用JSAP命令行解析器,其作用方式相同。如何解决这个问题?我希望我的大应用程序获得当前用户路径,而不是应用程序路径

什么会导致他们行为不同

您需要user.home属性,如

System.getProperty("user.home");
您需要user.home属性,如

System.getProperty("user.home");

我认为您会发现启动大型应用程序的批处理文件/shell脚本在启动Java之前正在将目录更改为主jar文件的目录,这就是为什么您的简单测试应用程序返回用户的工作目录以获取新文件。而大应用程序返回jar文件的目录

尝试在批处理文件的早期存储用户的CWD,然后将其传递给Java:

set savedcwd=%cd%
... later on ...
java "-Dsavedcwd=%savedcwd%"
然后在你的申请中

String savedcwd = System.getProperty("savedcwd");

我认为您会发现启动大型应用程序的批处理文件/shell脚本在启动Java之前正在将目录更改为主jar文件的目录,这就是为什么您的简单测试应用程序返回用户的工作目录以获取新文件。而大应用程序返回jar文件的目录

尝试在批处理文件的早期存储用户的CWD,然后将其传递给Java:

set savedcwd=%cd%
... later on ...
java "-Dsavedcwd=%savedcwd%"
然后在你的申请中

String savedcwd = System.getProperty("savedcwd");

1如上所述,如果要获取当前目录,一种方法是使用File..getAbsolutePath

2如果要获取用户的$PATH变量或任何环境变量,请使用System.getenv:


1如上所述,如果要获取当前目录,一种方法是使用File..getAbsolutePath

2如果要获取用户的$PATH变量或任何环境变量,请使用System.getenv:


当前用户路径是指用户启动应用程序的位置,即他调用java-jar./path/to/app/app.jar的位置?是的,我想要用户调用jar文件的目录。它似乎在一个小型的独立应用程序中工作。不是大应用程序,尽管我将代码插入了应用程序主文件的第一行。当前用户路径指的是用户启动应用程序的位置,即他调用java-jar的位置。/path/to/app/app.jar?是的,我想要用户调用jar文件的目录。它似乎在一个小型的独立应用程序中工作。不是大的应用程序,即使我将代码插入了应用程序主程序的第1行。getAbsolutePath;给我相同的路径。getAbsolutePath;给我相同的路径。你是对的,你知道是否可以更改批处理文件,使其表现为直接从用户目录调用应用程序,而不是批处理文件所在的位置?我使用的是一个命令行解析器,我没有代码。文件路径在许多不同的命令行参数、不同的位置中使用。我不喜欢更改任何java代码。批处理文件将目录更改为jar文件的目录可能是有原因的。如果将批处理文件更改为不将目录更改为jar文件的目录,则可能会破坏其他内容。现在的问题是什么更容易修复:需要的Java代码。==Current\u Working\u目录或需要的批处理文件/Java代码。==Main\u JAR\u dir。不能同时指出两件事。这是一个或另一个。同样,您不能更改的值。JVM启动后,需要在运行java之前通过.bat/.sh cd对其进行设置。我只是再次查看了这个问题,在shell脚本中找不到目录的更改位置。对不起,这对我来说是全新的,我正在努力学习!谢谢你的帮助!查找在大应用程序的批处理文件中调用“java”的位置,并在java前面的一行中,输入命令:echo cwd=%cd%,然后在java put pause之前的一行中。然后,批处理文件将在启动java之前告诉您CWD是什么。我理解,唯一让我感到困惑的是,脚本看起来很直接。我没有看到cd或cad的任何修改,我查看了另一个具有类似脚本的命令行应用程序,它似乎收到了正确的工作目录。再次感谢!您是对的,您知道是否可以更改批处理文件,使其行为类似于直接从用户目录而不是批处理文件所在的位置调用应用程序?我使用的是一个命令行解析器,我没有代码。文件路径在许多不同的命令行参数、不同的位置中使用。我不喜欢更改任何java代码
。批处理文件将目录更改为jar文件的目录可能是有原因的。如果将批处理文件更改为不将目录更改为jar文件的目录,则可能会破坏其他内容。现在的问题是什么更容易修复:需要的Java代码。==Current\u Working\u目录或需要的批处理文件/Java代码。==Main\u JAR\u dir。不能同时指出两件事。这是一个或另一个。同样,您不能更改的值。JVM启动后,需要在运行java之前通过.bat/.sh cd对其进行设置。我只是再次查看了这个问题,在shell脚本中找不到目录的更改位置。对不起,这对我来说是全新的,我正在努力学习!谢谢你的帮助!查找在大应用程序的批处理文件中调用“java”的位置,并在java前面的一行中,输入命令:echo cwd=%cd%,然后在java put pause之前的一行中。然后,批处理文件将在启动java之前告诉您CWD是什么。我理解,唯一让我感到困惑的是,脚本看起来很直接。我没有看到cd或cad的任何修改,我查看了另一个具有类似脚本的命令行应用程序,它似乎收到了正确的工作目录。再次感谢!