【问题标题】:Setting directory path while running jar file from command line从命令行运行 jar 文件时设置目录路径
【发布时间】:2012-01-19 01:04:36
【问题描述】:

我有一个 jar 文件,其中有检测其绝对路径(启动此文件的当前目录)的函数。它工作正常。

但是现在,为了获得管理员权限,我从另一个 jar 文件启动这个文件,同时使用 elevation binary executable 类似:

Elevate.exe javaw.exe -jar path-to-my-jar-file  

在这里,请注意Elevate.exe 和 jar 文件在同一个目录中,但是我尝试只提供 jar 文件名和绝对路径,但在这两种方式中,文件启动时,它具有管理员权限和一切正常,除了现在相同的方法给出了错误的当前目录路径。

这次我得到:C:\Windows\System32 我已经尝试了很多东西,但是每次当我使用上述方法从另一个使用Runtime.getRuntime().exec("cmd \\c "); 的 jar 文件启动这个 jar 时,当前目录路径都没有被正确检测到。为什么会这样,在这种情况下我怎样才能找到正确的路径?

编辑: 我尝试使用以下方法获取正确的目录名称:

String dir = System.getProperty("user.dir") &&
String dir = new File (".").getAbsolutePath().toString();

当文件独立启动时,两者都返回相同的正确路径,从外部进程启动时返回C:\Windows\System32。请建议我应该怎么做才能解决这个问题。

【问题讨论】:

    标签: java jar filepath executable-jar


    【解决方案1】:

    我们看一下Runtime类的exec方法:

    这是一种方便的方法。调用 exec(command) 形式的行为与调用 exec(command, null, null) 完全相同。

    然后是exec(command, null, null)的描述:

    这是一种方便的方法。 exec(command, envp, dir) 形式的调用与调用 exec(cmdarray, envp, dir) 的行为方式完全相同

    所以调用 exec(command) 会导致调用 exec(cmdarray, envp, dir),下面是 exec(cmdarray, envp, dir) 的部分描述:

    新子进程的工作目录由dir指定。如果 dir为null,子进程继承当前工作目录 当前进程。

    在你的代码中参数dir为null,所以子进程继承了当前进程的当前工作目录,在本例中为Evalute.exe的工作目录

    C:\Windows\System32

    .

    如果你想得到相同的结果不管jar文件如何执行,你必须明确指定工作目录,只需使用下面的代码:

    Runtime.getRuntime().exec("cmd \\c ", null,  new File("your working dir"));
    

    代替:

    Runtime.getRuntime().exec("cmd \\c ");
    

    【讨论】:

    • 非常感谢您提供如此宝贵的答案。实际上 Elevate.exe 和 jar 文件位于同一目录中。同样在运行 Elevate.exe 之前,我传递命令“cd dir”,以便 dos 提示更改该特定目录。奇怪的是,在我的桌面上它可以在笔记本电脑上工作,而在 win7 上却没有。我会在前夜测试你的解决方案,因为我这里没有其他机器,但我相信它会工作,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2019-09-20
    • 2017-05-05
    相关资源
    最近更新 更多