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

Jaw*_*wsh 5 java ubuntu development-environment environment-variables windows-subsystem-for-linux

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

<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"
Run Code Online (Sandbox Code Playgroud)

CMD输入/输出:

C:\Users\jaall>javac --version
javac 11.0.1
Run Code Online (Sandbox Code Playgroud)

重击输入/输出:

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
Run Code Online (Sandbox Code Playgroud)

我已经坚持了一段时间,无法解决这个问题,也找不到在线解决方案。谢谢!

Jab*_*lin 17

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ 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.
Run Code Online (Sandbox Code Playgroud)

然后获取 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"
Run Code Online (Sandbox Code Playgroud)

现在关闭并重新打开 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"
Run Code Online (Sandbox Code Playgroud)


Mbu*_*aac 8

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

  • 这设置了变量,但保留了空格,这给我带来了问题 (3认同)
  • 我收到此错误:“错误:JAVA_HOME 未正确定义。我们无法执行 /mnt/c/Program Files/Java/jdk-11.0.7/bin/java”但是 win10 中的 JAVA_HOME 设置正确并按照您的步骤操作,但我得到这个错误 (3认同)
  • WSLENV 在这里解释:https://blogs.msdn.microsoft.com/commandline/2017/12/22/share-environment-vars- Between-wsl-and-windows/ (2认同)

Sen*_*esh 6

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

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

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

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

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

ls -l /mnt
Run Code Online (Sandbox Code Playgroud)

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

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

ln -s /mnt/d/dev/environment/ ~/dev
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

  • JAVA_HOME 作为环境变量,以及
  • JAVA_HOME/bin 作为路径变量。

在 WSL 中设置变量

放置下一行代码的最佳位置是在您的.bashrc文件中,但如果您设置了./bash_profileor/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
Run Code Online (Sandbox Code Playgroud)

在此过程中,让我们也添加 Maven:

export MAVEN_HOME=/mnt/d/software/apache-maven-3.6.2
Run Code Online (Sandbox Code Playgroud)

我的 WSL、Java 和所有其他开发工具都安装在我的第二块硬盘上(不是系统驱动器),请确保您的位置与 Windows 中的 JAVA_HOME 路径相匹配。

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

执行

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

Windows PowerShell/cmd:

javac GetStringLength.java
java GetStringLength
Run Code Online (Sandbox Code Playgroud)

WSL:

javac.exe GetStringLength.java
java.exe GetStringLength
Run Code Online (Sandbox Code Playgroud)

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

简单

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

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

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


men*_*ana 5

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

我将此添加到/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\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}"
}
Run Code Online (Sandbox Code Playgroud)

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