【问题标题】:Can I detect the Java version from native c++我可以从本机 C++ 检测 Java 版本吗
【发布时间】:2010-10-28 15:16:50
【问题描述】:

我正在用原生 C++/MFC 编写一个复杂的设置/安装程序。我非常希望能够检测到已安装的 Java 版本(如果有的话)。

这可能吗?如何?

【问题讨论】:

    标签: java c++ version


    【解决方案1】:

    派生一个执行以下命令的进程:java -version。收集输出并解析它。它看起来像下面这样:

    java version "1.5.0_16"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
    Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)
    

    这是写入标准错误的。您需要收集 stderr 输出并对其进行解析。

    【讨论】:

    • 我要补充一点,您可能需要平台上的外壳程序的帮助,否则执行“java”将无济于事,因为您的当前目录中可能没有“java”二进制文件。在 *nix 上,您将执行类似 "sh -c 'java -version'" 的内容,以确保您实际上是从路径执行 java。我不确定 Windows 上的等价物。
    • @Sean Owen:Windows 通常会自动查找进程的 PATH 环境变量,无需任何 shell 的帮助。
    • 如何收集该输出?我一直试图通过将 STDOUT 重定向到文本文件,然后解析文本文件来做到这一点。但是,它似乎没有使用 STDOUT,因为数据仍然进入屏幕而不是文件......
    • 多哈。没关系。无论出于何种原因,它都会通过 STDERR 而不是 STDOUT 进行屏幕输出。啊。 :-)
    【解决方案2】:

    我建议使用注册表。您正在对窗口进行编程,因此以窗口方式进行。注册焦虑是不合理的。

    版本的注册表键:

    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\CurrentVersion
    

    如何从注册表中获取值的信息可以在here找到。

    其他java相关注册表项的信息可以在here找到。

    【讨论】:

      【解决方案3】:

      您可以尝试在子进程中运行java -version(使用管道读取该进程的输出)并解析结果(如果有);或者,您可能会弄乱 Windows 的注册表(感觉更复杂,但可能不那么笨拙)。

      【讨论】:

      • 我设法在 SOFTWARE\JavaSoft\Java Runtime Environment\BrowserJavaVersion 中找到并解析了版本信息,谢谢
      • 从 C++ 程序中“启动 Java DLL”是否可行?应该很好地了解机器上的默认 JVM 是什么。
      • 浏览器版本不可能是真正的系统版本...我建议你改用@emg-2 答案。
      【解决方案4】:

      还要记住,一台机器上同时安装多个 JRE 是完全可能的。如果您的安装程序检测到多个 JRE,它应该为用户提供一个选择,而不是假设其中一个(例如最新的一个)应该是您的应用将使用的那个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-11
        • 2013-01-03
        • 2017-04-12
        • 2018-08-03
        • 2014-03-06
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多