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

Windows Subsystem for Linux not recognizing JAVA_HOME Environmental Variable

我正在尝试让 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 INPUT/OUTPUT:

C:\Users\jaall>javac --version
javac 11.0.1

BASH INPUT/OUTPUT:

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。

  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”文件夹。

因为我从来没有能够轻松地在两个系统之间共享变量,所以我创建了一个简单的 bash 函数,它可以轻松检索(并定义,如果被要求)任何 Windows 环境多变的。 它还会处理路径,以便将它们从 Win32 转换为 Un*x-line。

我将此添加到 /etc/bash.bashrc:

winenv()
{
  if [ "$#" == "0" ] || [ "" == "--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=
  [ "" == "-d" ] && PATH_TO_TRANSLATE=
  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}"
  [ "" == "-d" ] && export "${PATH_TO_TRANSLATE}=${NEW}"
}

要显示一个,我要做的就是调用 winenv PROGRAMFILES(例如)
或者,如果我希望导出它,我只需要在变量名 之前添加一个 -d 参数 ,如 winenv -d WINDIR.

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

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

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

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

在 WSL 中,在 PC 上列出符号 links:

ls -l /mnt

如果 root 拥有任何驱动器,请在 /mnt/c/Users/<UserName>

中执行您的 WSL 开发工作

就个人而言,我在Windows中创建一个开发目录,并在WSL中的目录中添加一个符号link:

ln -s /mnt/d/dev/environment/ ~/dev

cd dev 现在将您带到您的开发目录。

确保 Java 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 结构,则可以将其放置在那里.

# 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

我有我的 WSL,Java,我的所有其他开发工具都安装在我的第二个 HDD 上,它不是系统驱动器,请确保您的位置与 JAVA_HOME 中的路径匹配116=].

For instance, if in Windows, Java is located at: C:\Java\jdk8.0 The corresponding WSL mount point is: /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

Using java <args> in WSL will result in a Command 'java' not found error. That is because running windows binaries from within WSL requires that the .exe extension is used in the command.

简单

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

NOTE: In order to run a program, it must either be a Path variable, or be run from within it's containing folder.

希望这对您和我一样容易。请记住根据您正在 运行 的 OS 二进制文件使用正确的命令。这花了我大约 10 分钟来设置,并且是交叉编译和一般易用性的救星。

我最初让 Maven 在 Windows 中工作,尝试在 WSL2 中 运行 Maven 并尝试了所有以前的解决方案,但无论我为 [=22= 设置什么,都会始终如一地得到以下结果] 和路径:

$ mvn -v
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE

问题是我试图在 WSL2 Linux 内核中使用 Windows 版本的 JDK。为了解决这个问题,我最终不得不在 WSL 中安装 JDK(版本 11)的 Linux 版本,如下所示:

$ sudo apt update
$ sudo apt install openjdk-11-jdk
$ sudo update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-11-openjdk-amd64/bin/java
Nothing to configure.

然后获取 JDK 的路径并使用它来创建 JAVA_HOME 并通过在 .profile

中附加以下内容来更新 PATH
export PATH="/usr/lib/jvm/java-11-openjdk-amd64/bin/java:$PATH"
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

现在关闭并重新打开 WSL2,当您重试时:

$ mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.13, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.10.16.3-microsoft-standard-wsl2", arch: "amd64", family: "unix"