Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从应用程序获取JRE版本_Java - Fatal编程技术网

Java 从应用程序获取JRE版本

Java 从应用程序获取JRE版本,java,Java,我需要从我的应用程序中获取用户当前安装在其机器上的java版本。但是,我安装的应用程序带有一个自包含的JRE,当我执行System.getProperty(“java.version”)时,它只返回该自包含JRE的版本。我是否可以获得安装在计算机上的版本?您可以尝试查找已知路径,例如C:\Program Files\Java,但除非您扫描整个文件系统以查找Java或Java.exe,否则您永远无法确定 这可能无法按预期工作,因为运行应用程序的用户不应访问系统目录。您可以强制应用程序以管理员级别的

我需要从我的应用程序中获取用户当前安装在其机器上的java版本。但是,我安装的应用程序带有一个自包含的JRE,当我执行
System.getProperty(“java.version”)
时,它只返回该自包含JRE的版本。我是否可以获得安装在计算机上的版本?

您可以尝试查找已知路径,例如
C:\Program Files\Java
,但除非您扫描整个文件系统以查找
Java
Java.exe
,否则您永远无法确定

这可能无法按预期工作,因为运行应用程序的用户不应访问系统目录。您可以强制应用程序以管理员级别的访问权限启动,但这会带来安全风险


如果您已经将JRE与应用程序捆绑在一起,那么您的要求似乎有点毫无意义。

JRE安装在注册表中的注册表项中列出,仅适用于Windows,Linux没有中央注册表

HKEY\U本地\U机器\SOFTWARE\JavaSoft\Java运行时环境

您可以制作一个简单的程序进行测试:

public class ShowVersion {
 public static void main(String args[]) {
   System.out.println(System.getProperty("java.version"));
 }
}
或者您可以尝试命令提示符

键入
java-version

有关更多信息,请参考SO的姐妹网站:


您可以使用java(java-version)运行cmd命令,并使用该输出获取版本

    List<String> cmdArgs = new ArrayList<>();   

                        cmdArgs.add("cmd.exe");
                        cmdArgs.add("/C");
                        cmdArgs.add("java -version");

    ProcessBuilder processBuilderObj = new ProcessBuilder();
                    processBuilderObj.command(cmdArgs);
      Process process = processBuilderObj.start();
 //get inputStream 
                        BufferedReader data = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line1;
                        while ((line = data.readLine()) != null){
                            System.out.println(line);
                        }
List cmdArgs=new ArrayList();
cmdArgs.add(“cmd.exe”);
cmdArgs.add(“/C”);
add(“java-version”);
ProcessBuilderProcessBuilderRobj=新的ProcessBuilder();
processBuilderObj.command(cmdArgs);
Process Process=processBuilderObj.start();
//获取输入流
BufferedReader数据=新的BufferedReader(新的InputStreamReader(process.getInputStream());
字符串行1;
而((line=data.readLine())!=null){
系统输出打印项次(行);
}
如果您正在绑定JRE(您是否检查了分发许可证?确保您可以这样做),并且它正在该版本下运行,那么您将获得该版本

如果用户在另一个JRE下运行它,您将获得该JRE的版本。事情就是这样的

事实上,如果您使用的是自包含的JRE,那么用户甚至不需要在其系统上安装另一个JRE,这就是首先捆绑一个JRE的全部意义

除了完整的文件系统扫描之外,不可能知道可能安装了哪些其他JVM,如果这样做,则必须考虑Java运行时可执行文件可能具有的所有不同名称,具体取决于您运行的文件系统。在找到所有这些可执行文件后,您仍然无法真正了解它们属于哪个版本的Java,除非您对这些可执行文件进行二进制分析,或者从安装这些可执行文件的目录中的其他文件中检测信息,可能存在或不存在的文件取决于所讨论的系统、设置方式、使用的JVM以及是否手动更改了安装


例如,在JDK安装的根目录中有一个名为“release”的文件,其中包含JVM版本,但AFAIK不需要该文件,JVM才能正常工作。并且您的应用程序可能没有文件系统读取该文件的权限。

system.getProperty(“java.version”)
返回应用程序运行的java版本,调用“
java-version
”,因为java应用程序中的系统命令将返回默认版本(已安装)在您的系统中使用Java

以下是以编程方式查找它的一般步骤:

  • 使用Java中的ProcessBuilder,执行系统命令“
    Java-version
    ”。这当然是平台独立的
  • 读取已执行进程的输出。版本通常位于输出的第1行(smth,如java版本“1.8.0_191”),因此读取第1行就足够了
  • 使用正则表达式检查,如果输出与包含java版本的字符串匹配,您只需解析该版本,这就是您要查找的内容
  • 否则,这意味着输出是一条错误消息(smth-like-bash:java:command-not-found),并且您的系统中没有安装java
  • 控制面板
  • 爪哇
  • Java选项卡
  • 看法 您可以看到所使用的java的确切版本及其位置

  • 可能重复的可能重复的“已安装的版本”可能安装了多个版本。但这听起来像是个XY问题。看到了吗?linux系统上的注册表中也有这些信息吗?@ErwinSmout-linux不像Windows那样有一个集中的注册表。Idk为什么你问这个问题并投了反对票,因为我已经知道了,这使得这个答案很糟糕。至少你可能已经明确了这样一个事实,即这种黑客行为使程序依赖于操作系统,这打破了人们使用java的最重要原因之一。@ErwinSmout,但CMD
    java-version
    仍将提供机器上安装的版本信息。如果Java可执行文件不在操作系统的搜索路径上,您总是可以通过
    $whereis Java
    找到yoiur Java的安装位置。如果我只是解压了一个归档文件,并且没有在/usr/sbin或类似的文件中添加符号链接,那么就不会出现这种情况。更广泛的问题是,在这里回答这个问题没有指出为什么不应该问这个问题那么有帮助。最后两段+1,但第一段-1。总的来说,我经常感到困惑的是,这里的响应者如何容易地让提问者在他们的程序中引入操作系统依赖项,而整个程序