Linux的Windows子系统无法识别JAVA_HOME环境变量

Linux的Windows子系统无法识别JAVA_HOME环境变量,java,ubuntu,environment-variables,development-environment,windows-subsystem-for-linux,Java,Ubuntu,Environment Variables,Development Environment,Windows Subsystem For Linux,我试图让WSL识别windows安装的环境变量JAVA_HOME。我附加了我在bashrc和windows环境变量中的内容以及cmd和bash的输出。 在我的bashrc的末尾是什么: export JAVA_HOME="/mnt/d/Program Files/Java/jdk-11.0.1" export PATH="/mnt/d/Program Files/Java/jdk-11.0.1/bin:$PATH" CMD输入/输出: C:\Users\jaall>javac --v

我试图让WSL识别windows安装的环境变量JAVA_HOME。我附加了我在bashrc和windows环境变量中的内容以及cmd和bash的输出。

在我的bashrc的末尾是什么:

export JAVA_HOME="/mnt/d/Program Files/Java/jdk-11.0.1"
export PATH="/mnt/d/Program Files/Java/jdk-11.0.1/bin:$PATH"
CMD输入/输出:

C:\Users\jaall>javac --version
javac 11.0.1
myubuntu_name@DESKTOP-LUK3BII:~$ javac --version

Command 'javac' not found, but can be installed with:

sudo apt install default-jdk
sudo apt install openjdk-11-jdk-headless
sudo apt install ecj
sudo apt install openjdk-8-jdk-headless
BASH输入/输出:

C:\Users\jaall>javac --version
javac 11.0.1
myubuntu_name@DESKTOP-LUK3BII:~$ javac --version

Command 'javac' not found, but can be installed with:

sudo apt install default-jdk
sudo apt install openjdk-11-jdk-headless
sudo apt install ecj
sudo apt install openjdk-8-jdk-headless

我已经在这个问题上纠缠了一段时间,无法弄明白它,也无法在网上找到一个有效的解决方案。谢谢

正如Biswapriyo所建议的,您应该使用WSLENV

  • 打开PowerShell。然后将JAVA_HOME设置为JAVA安装的路径

  • 在您的情况下,运行
    setxjava\u HOME“D:\ProgramFiles\JAVA\jdk-11.0.1”

  • 您应该会看到一条消息,上面写着“成功:已保存指定的值

  • 然后运行
    setx WSLENV“JAVA\u HOME/p”
  • 您应该再次看到成功消息

  • 在WSL bash提示符中键入“env”
  • 此时您应该看到JAVA_HOME设置正确


    注意:如果第2步不起作用,您可能希望更改JAVA_HOME的路径以包含“\bin”文件夹。

    由于我从未能够在两个系统之间轻松共享变量,因此我创建了一个简单的bash函数,可以轻松检索(并定义,如果要求)任何Windows环境变量。 它还负责将路径从Win32转换为Un*x-line

    我将其添加到
    /etc/bash.bashrc

    winenv()
    {
      if [ "$#" == "0" ] || [ "$1" == "--help" ]
      then
        echo $'\n'Usage:
        echo $'\t'winenv [-d] WINDOWS_ENVIRONEMENT_VARIABLE_NAME
        echo $'\t'-d: Defines environment variable in current shell
        echo $'\t    Note that paths will be translated into un*x-like paths\n'
        return
      fi
      local IFS='$\n'
      local PATH_TO_TRANSLATE=$1
      [ "$1" == "-d" ] && PATH_TO_TRANSLATE=$2
      local VAR=$(cmd.exe /c echo %${PATH_TO_TRANSLATE}% | tr -d '\r')
      local NEW=$(wslpath -u "${VAR}" 2>/dev/null || echo ${VAR})
      echo "${PATH_TO_TRANSLATE} = ${VAR} -> ${NEW}"
      [ "$1" == "-d" ] && export "${PATH_TO_TRANSLATE}=${NEW}"
    }
    
    要显示一个,我所要做的就是调用
    winenv PROGRAMFILES
    (例如)

    或者,如果我希望导出它,我只需要在变量名之前添加a-d参数,如
    winenv-d WINDIR

    TL;DR:在WSL中,您必须使用
    javac.exe
    ,因为它是一个Windows二进制文件。简单地键入
    javac
    将无法工作,即使路径设置正确。如果这样做不起作用rk,尝试将
    。/bin
    添加到
    JAVA\u HOME
    变量的末尾

    在WSL中使用Windows二进制文件和环境变量 有一种更简单的方法可以让Windows和WSL使用相同的JavaSDK二进制文件,您只需要先设置几件事。最重要的是,如果您在Windows上安装了JavaSDK,您就不需要安装Linux二进制文件

    检查WSL权限和目录链接(可选,但推荐) 在WSL中,列出PC上的符号链接:

    ls-l/mnt
    
    如果任何驱动器属于
    root
    ,请在
    /mnt/c/Users/

    就我个人而言,我在Windows中创建了一个开发目录,并在WSL中添加了一个指向该目录的符号链接:

    ln-s/mnt/d/dev/environment/~/dev
    
    cd-dev
    现在将带您进入开发目录

    确保Java for Windows正常工作 从任意目录打开
    PowerShell
    /
    cmd.exe
    ,然后输入:
    java--version

    您应该获得JRE信息列表:

    openjdk 11.0.4 2019-07-16 LTS
    OpenJDK运行时环境Corretto-11.0.4.11.1(构建11.0.4+11-LTS)
    OpenJDK 64位服务器VM Corretto-11.0.4.11.1(构建11.0.4+11-LTS,混合模式)
    
    您的版本可能不同,重要的是系统知道在哪里可以找到Java。如果出现错误,请确保Windows环境变量设置正确:

    • JAVA_HOME作为环境变量,以及
    • JAVA_HOME/bin作为路径变量
    在WSL中设置变量 放置下一行代码的最佳位置是
    .bashrc
    文件,但是如果您设置了
    /bash\u profile
    /etc/profile
    结构,则可以将其放置在那里

    #共享环境变量
    #使用“java.exe”从WSL中利用Windows java二进制文件。
    导出JAVA_HOME=/mnt/d/JAVA/jdk11.0.4_10
    
    当我们开始时,让我们也添加Maven:

    export MAVEN_HOME=/mnt/d/software/apache-MAVEN-3.6.2
    
    我在第二个硬盘上安装了WSL、Java和所有其他开发工具,该硬盘不是系统驱动器,请确保您的位置与Windows中的Java_主路径匹配

    例如,如果在Windows中,Java位于:
    C:\Java\jdk8.0
    相应的WSL挂载点是:
    /mnt/c/Java/jdk8.0

    执行 重要提示:在WSL中使用
    java.exe
    ,而不是
    java
    假设您刚刚编写了
    CompareTowStrings.class
    ,并希望使用Windows二进制文件编译和运行它。您可以从Windows shell或WSL执行此操作

    Windows PowerShell/cmd:

    javac GetStringLength.java
    java GetStringLength
    
    javac.exe GetStringLength.java
    java.exe GetStringLength
    
    WSL:

    javac GetStringLength.java
    java GetStringLength
    
    javac.exe GetStringLength.java
    java.exe GetStringLength
    
    在WSL中使用
    java
    将导致
    命令“java”未找到
    错误。这是因为从WSL中运行windows二进制文件需要在命令中使用
    .exe
    扩展名

    简单 我们不想安装第二个特定于WSL的Java副本,浪费宝贵的磁盘空间,因此我们将从WSL外壳调用Windows二进制文件。这是WSL-WSL1的一个巨大优势,特别是它可以与Windows文件系统完美地交互(几乎)

    注意:要运行程序,它必须是
    路径
    变量,或者从其包含的文件夹中运行


    希望这对您和对我一样容易。请记住根据您正在运行的操作系统二进制文件使用正确的命令。这花了我大约10分钟的时间进行设置,并且为交叉编译和总体易用性提供了一个救生圈。

    使用
    javac.exe
    命令。我建议使用
    WSLENV
    环境Link:WSLENV在这里解释说:这设置了变量,但保留了空格,这给meI带来了问题。获取此错误:“错误:JAVA_HOME没有正确定义。我们不能执行/mnt/c/Program Files/Java/jdk-11.0.7/bin/Java”,但Java_HOME in win