【问题标题】:JAVA_HOME on Windows seems to have no effectWindows 上的 JAVA_HOME 似乎没有效果
【发布时间】:2021-01-05 17:55:23
【问题描述】:

我的系统上有三个不同的 JDK,因此我可以在项目之间适当地切换。在我的 IDE 中导入适当的 JDK 没有问题,但命令行是。看,尽管我的用户和系统的JAVA_HOME 都指向jre1.8.0_261

java --version 似乎仍然认为我的默认是亚马逊的 Corretto JDK,我只需要一个特定的项目:

C:\Users\jasonfil>java --version
openjdk 11.0.8 2020-07-14 LTS
OpenJDK Runtime Environment Corretto-11.0.8.10.1 (build 11.0.8+10-LTS)

Powershell 也是如此。我还以管理员身份尝试了cmd Powershell。同样的问题。

奇怪的是,当我从 cmd 查询环境变量时,我得到了预期的 JDK:

C:\Users\jasonfil>echo %JAVA_HOME%
C:\Program Files (x86)\Java\jre1.8.0_261

在 Powershell 上,echo 只输出字符串 %JAVA_HOME

PS C:\Users\jasonfil> echo %JAVA_HOME%
%JAVA_HOME%

我的目标是能够在 Java 版本之间随意切换,就像基于 UNIX 的系统中的 update-alternatives 机制一样。有什么想法吗?

【问题讨论】:

  • stackoverflow.com/questions/63910493/… 这能回答你的问题吗?
  • 没有理由在用户和系统环境下将JAVA_HOME 列为具有相同值C:\Program Files (x86)\Java\jre1.8.0_261。由于用户环境优先于系统,我通常建议删除 System.xml 下的条目。但是,我的一般经验法则是,用户环境应该只包含用户自己的配置文件树中的值路径,或者其他用户不应访问的值路径。您需要自己决定要删除两者中的哪一个。顺便说一句,在 PowerShell 中,您将访问变量为 $Env:JAVA_HOME 而不是 %JAVA_HOME%
  • 目前的答案已经涵盖了这一点,但要明确一点:Java 根本不使用 JAVA_HOME 环境变量。 各种工具将使用该变量,例如IDE 和构建工具,但 Java 本身并不关心该变量,也不读取它。与任何其他可执行程序一样,java.exe 的位置由您的Path 环境变量决定。
  • 请查看What is the reason for "X is not recognized as an internal or external command, operable program or batch file"? 它详细解释了cmd.exepowershell.exe(以及cscript.exewscript.exe 以及许多其他应用程序和Windows 功能)如何找到可执行文件或指定的脚本文件没有路径和文件扩展名。
  • 所有使用接受的答案和这些 cmets 修复。非常感谢。

标签: java windows powershell cmd java-home


【解决方案1】:

您得到的所有输出都符合预期

  1. JAVA_HOME 与 Java 版本无关。它只是一个变量,通常大多数基于 Java 的软件(例如 Web 和应用服务器、IDE 等)使用它来指代 JDK 安装。因此,您应该将其设置为 JDK 的基本文件夹,例如C:\Program Files\Java\jdk1.8.0_261
  2. java -version 查找位于 JDK 安装的 bin 文件夹内的 java.exe,例如C:\Program Files\Java\jdk1.8.0_261\bin。因此,C:\Program Files\Java\jdk1.8.0_261\bin 应该是您的 PATH 变量中的值之一。如果您已经如上所述设置了JAVA_HOME,那么设置java.exe 的路径会变得更容易,因为您可以在PATH 变量中设置%JAVA_HOME%\bin 而不是C:\Program Files\Java\jdk1.8.0_261\bin
  3. echo %JAVA_HOME% 将返回您在 JAVA_HOME 变量中设置的值。同样,如果您使用echo %PATH%,您将获得在您的PATH 变量中设置的值。

注意:不向您提供以 Java-11 开头的 JRE。

【讨论】:

    【解决方案2】:

    Java 不使用JAVA_HOME 环境变量。有些工具可以,尤其是在安装工具的过程中,但那是不同的。

    Java 甚至不需要在PATH 上,但如果是的话肯定更方便。

    问题显示C:\Program Files (x86)\Java\jre1.8.0_261处安装了Java。

    它还显示某处有一个 OpenJDK 11.0.8,但没有显示在哪里,所以对于这个答案,我们假设它已安装/解压缩到 C:\foo\openjdk-11.0.8

    java 可执行文件位于bin 文件夹中,因此要显示PATHJAVA_HOME 无关紧要,请运行完全限定的java 命令。在我的机器上,我得到以下输出 (具有不同的实际路径,我有不同的版本,但无论如何)

    C:\>"C:\Program Files (x86)\Java\jre1.8.0_261\bin\java" -version
    java version "1.8.0_181"
    Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
    
    C:\>C:\foo\openjdk-11.0.8\bin\java -version
    openjdk version "11.0.2" 2019-01-15
    OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
    

    运行不合格的java当然更容易,所以把你想要的Java的bin文件夹添加到PATHfront。您甚至可以在命令提示符中更改该命令提示符的“默认”Java,而不会影响该环境属性对话框中指定的“全局默认值”。

    如果需要,您可以在同一命令提示符下继续执行此操作来来回切换,但您希望限制这一点,因为 PATH 会变得越来越长,并且有很多冗余条目,多做点。

    C:\>set PATH=C:\Program Files (x86)\Java\jre1.8.0_261\bin;%PATH%
    
    C:\>java -version
    java version "1.8.0_181"
    Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
    
    C:\>set PATH=C:\foo\openjdk-11.0.8\bin\java\bin;%PATH%
    
    C:\>java -version
    openjdk version "11.0.2" 2019-01-15
    OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
    

    【讨论】:

      【解决方案3】:

      cmd 和 Powershell 都会引用 Path 变量来检查请求的可执行文件是否在 PATH 中。 JAVA_HOME 变量将仅由 IDE 或 Java 应用程序使用。因此,要在路径中包含所需的 JDK,请将 Path 环境变量的 JDK 路径附加到用户变量(如果您希望此设置只影响当前登录的用户,即您的登录名)或系统变量。

      添加这些设置后,请确保重新打开 cmd 或 Powershell 控制台以使设置生效。

      【讨论】:

        【解决方案4】:

        如果 PATH 环境变量包含您机器上每个 java 安装的条目,那么控制台将始终使用首先出现在 PATH 环境变量中的 java 安装。如果要使用特定版本的 java,请修改路径环境变量,以便在任何其他已安装的 java 版本之前声明 java 的 bin 文件夹版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 2018-05-18
          • 1970-01-01
          • 2010-12-24
          • 2020-07-04
          相关资源
          最近更新 更多