Windows Subsystem for Linux 无法识别JAVA_HOME环境变量在 WSL 中使用 Windows 二进制文件和环境变量

我正在尝试让 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

我已经在这个问题上困了一段时间,无法弄清楚或在线找到有效的解决方案。谢谢!


答案 1

正如Biswapriyo所建议的那样,你应该使用WSLENV。

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

  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


答案 2

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

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

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

检查 WSL 权限和目录链接(可选,但建议使用)

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

ls -l /mnt

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

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

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

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

确保 Java for Windows 正常工作

从任何目录打开 / 并输入:PowerShellcmd.exejava --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 中设置变量

放置下一行代码的最佳位置是在您的文件中,但是如果您设置了 or 结构,则可以将其放在那里。.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

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

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

执行

重要:在 WSL 中使用,而不是说你刚刚编写并希望使用 Windows 二进制文件编译和运行它。你可以从Windows shell或WSL做到这一点。java.exe <args>java <args>CompareTwoStrings.class

Windows PowerShell/cmd:

javac GetStringLength.java
java GetStringLength

WSL:

javac.exe GetStringLength.java
java.exe GetStringLength

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

单纯

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

注意:为了运行程序,它必须是一个变量,或者从它包含的文件夹中运行。Path

希望这对你和我一样容易。只需记住使用正确的命令,具体取决于您正在运行的操作系统二进制文件。这花了我大约10分钟来设置,并且一直是交叉编译和一般易用性的救星。


推荐