c ++以编程方式检索java.exe路径

时间:2017-07-11 17:35:47

标签: c++ windows java-home

我正在尝试检索 Windows 上的java.exe安装路径。但是,到目前为止我无法成功。

我所尝试的是:

  1. getenv("JAVA_HOME"),在我看来很少设置(大部分都没有返回,因为它没有设置?)
  2. CMD命令for %i in (java.exe) do @echo. %~$PATH:i,它在cmd中手动执行时返回路径,但是我无法在c ++中以编程方式检索它?我执行此代码时_popen没有返回任何内容,但是简单的dir语句确实会返回正确的输出(目录列表)。
  3. 所以,我想要的只是检索java.exe所在的路径,这是我在应用程序中需要的路径。如果您有任何好主意,请告诉我。我愿意解决这个问题。

    string cmd(char *command) {
        FILE *fpipe;
        string response = "";
        char c = 0;
        if (0 == (fpipe = (FILE*)_popen(command, "r"))) {
            Exit("popen() failed.");
        }
        while (fread(&c, sizeof c, 1, fpipe)) {
            //printf("%c", c);
            response += c;
        }
        _pclose(fpipe);
        return response;
    }
    cout << cmd("for %i in (java.exe) do @echo. %~$PATH:i") << endl; //EMPTY (MANUAL ON CMD RETURNS THE RIGHT PATH)
    cout << cmd("dir"); //RETURNS LIST OF CONTENTS
    

2 个答案:

答案 0 :(得分:3)

如果您希望应用程序在各种计算机上运行,​​则不能假设任何固定路径,并且通常不能假设已设置某些环境变量。用户几乎总能选择完全任意的安装位置。通常,通过Windows注册表获取有关程序安装位置信息的唯一正确可靠的方法。甚至假设通过安装程序进行安装,实际上将该信息写入注册表。

在Win注册表中找到JRE安装路径

对于Oracle Java Runtime,您需要的所有信息都存储在注册表中,前提是它是使用自己的安装程序安装的。

相关的注册表路径取决于Java的类型和Windows的类型。

64位Windows上的64位Java或32位Windows上的32位Java:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
<64> 64位Windows上的32位Java:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment

该密钥的条目 CurrentVersion 包含最新安装的版本号。它还有许多子键,每个安装的Java Runtime版本至少有一个子键。这些键具有条目 JavaHome ,其中包含顶级Java安装目录。我不太熟悉Java,但我认为从该位置开始修复目录和文件布局,以便您可以假设 java.exe 始终可以在相同的路径中找到的JavaHome

为了使这一点更清楚,假设您已安装1.8.0_111版本作为最新版本。

  • 您的 CurrentVersion 条目将为“1.8”。
  • 您将拥有该版本的两个子密钥。

    ...\Java Runtime Environment\1.8
    ...\Java Runtime Environment\1.8.0_111
    
  • 两个子键都有一个指向安装目录的 JavaHome 条目,例如:“C:\ Program Files(x86)\ Java \ jre1.8.0_111”。< / p>

使用C ++访问注册表

您可以直接使用WinAPI。对于查询一些甚至可能合理的密钥的简单任务。还有一大堆库包装WinAPI并为您提供更多类似C ++的WinAPI注册表函数接口。我没有使用它们,所以我不推荐一个。

答案 1 :(得分:2)

使用JAVA_HOME已被弃用了一段时间,因此您使用的涉及该变量的任何解决方案都会严重老化。

如果使用标准Oracle安装程序安装Java,则%ProgramData%\Oracle\Java\javapath\java.exe应该是指向当前启动程序的链接。它是一个实际的链接,而不是一个“Windows快捷方式”蹩脚的伪symlink-wannabe,所以你可以直接使用该路径名(无论如何检索ProgramData环境变量之后)。 javapath部分是一些NTFS硬链接/交叉魔术发生的地方,特别是它可以添加到$PATH而不是不断地更新“Java / jre-XYZ / bin”和类似

如果Java是以其他方式安装的 - 例如,故意没有安装程序的“Server JRE”可以放在你拥有写权限的任何地方 - 那么你需要在CMD中搞乱那个$ PATH技巧。我不知道为什么popen不会工作,除了Windows再次做自己的事情而不是简单地遵循POSIX标准(这就是为什么我的办公室基本上放弃了直接在Windows上编写代码)。