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

新手上路,请多包涵

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

<code>在此处输入图片描述</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"

命令输入/输出:

 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

我已经坚持了一段时间,无法弄清楚或在线找到有效的解决方案。谢谢!

原文由 Jawsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
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 文件夹。

原文由 Mbuotidem Isaac 发布,翻译遵循 CC BY-SA 4.0 许可协议

TL;DR: 在 WSL 中,您必须使用 javac.exe 因为它是 Windows 二进制文件。只需键入 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 作为 Path 变量。

在 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

我在我的第二个 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/命令:

 javac GetStringLength.java
java GetStringLength

世界语言联盟:

 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 分钟来设置,并且是交叉编译和一般易用性的救命稻草。

原文由 SentientFlesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题