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

时间:2018-11-18 21:28:04

标签: java ubuntu environment-variables development-environment windows-subsystem-for-linux

我试图让WSL识别我的Windows安装的JAVA_HOME环境变量。我附上了bashrc中的内容以及Windows环境变量中的内容以及cmd和bash的输出。 JAVA_HOME Env. Var.

<code>enter image description here</code>

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

BASH输入/输出:

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

我已经坚持了一段时间,无法解决问题或无法在线找到可行的解决方案。谢谢!

3 个答案:

答案 0 :(得分:2)

按照Biswapriyo的建议,您应该使用WSLENV。

  1. 打开PowerShell。然后将JAVA_HOME设置为您的Java安装路径。

  2. 以您的情况运行setx JAVA_HOME "D:\Program Files\Java\jdk-11.0.1"

您应该看到一条消息,内容为:“成功:指定的值已保存。

  1. 然后运行setx WSLENV "JAVA_HOME/p"

您应该再次看到成功消息。

  1. 在您的WSL bash提示符中键入“ env”。

此时您应该看到正确设置了JAVA_HOME。

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

答案 1 :(得分:1)

TL; DR::在WSL中,由于它是Windows二进制文件,因此必须使用javac.exe。即使正确设置了路径,仅键入javac也不起作用。如果这样不起作用,请尝试在../bin变量的末尾添加JAVA_HOME

在WSL中使用Windows二进制文件和环境变量

有一种更简单的方法可以使Windows和WSL利用相同的JavaSDK二进制文件,您只需要先进行一些设置即可。最好的是,如果Windows上安装了JavaSDK,则不需要。Linux二进制文件。

检查WSL权限和目录链接(可选,但推荐)

在WSL中,列出PC上的符号链接:

ls -l /mnt

如果root拥有任何驱动器,请在/mnt/c/Users/<UserName>中执行WSL开发工作

我个人在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 Runtime Environment Corretto-11.0.4.11.1 (build 11.0.4+11-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.4.11.1 (build 11.0.4+11-LTS, mixed mode)

您的版本可能有所不同,重要的部分是系统知道在哪里可以找到Java 。如果出现错误,请确保正确设置了Windows环境变量:

  • JAVA_HOME作为环境变量,并且
  • JAVA_HOME / bin作为路径变量。

在WSL中设置变量

放置下一行代码的最佳位置是您的.bashrc文件中,但是如果您设置了./bash_profile/etc/profile结构,则可以将其放置在这里。 / p>

# Shared environment variables
# Use 'java.exe <args>' to utilize Windows Java binaries from within WSL.
export JAVA_HOME=/mnt/d/Java/jdk11.0.4_10

在处理的同时,我们也添加Maven:

export MAVEN_HOME=/mnt/d/software/apache-maven-3.6.2

我在不是系统驱动器的第二个HDD上设置了WSL,Java和所有其他开发工具,请确保您的位置与Windows中的JAVA_HOME路径匹配。

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

执行

重要:在WSL中使用java.exe <args>代替java <args> 假设您刚刚编写了CompareTwoStrings.class,并想使用Windows二进制文件进行编译和运行。您可以从Windows Shell或WSL进行操作。

Windows PowerShell / cmd:

javac GetStringLength.java
java GetStringLength

WSL:

javac.exe GetStringLength.java
java.exe GetStringLength

在WSL中使用java <args>将导致Command 'java' not found错误。这是因为从WSL中运行Windows二进制文件要求在命令中使用.exe扩展名

简单性

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

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

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

答案 2 :(得分:0)

由于我一直无法轻松地在两个系统之间共享变量,因此创建了一个简单的bash函数,该函数可以轻松检索(并定义(如果要求))任何Windows Environment变量。 它还照顾路径,使它们从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(例如)
或者,如果我希望导出它,则只需在变量名之前 之前添加{-{1}}中的-d参数即可。