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。
打开 PowerShell。然后将 JAVA_HOME 设置为 java 安装路径。
在你的情况下,运行 setx JAVA_HOME "D:\Program Files\Java\jdk-11.0.1"
您应该会看到一条消息,内容为“成功:已保存指定的值。
- 然后运行
setx WSLENV "JAVA_HOME/p"
您应该会再次看到成功消息。
- 在 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"
我正在尝试让 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。
打开 PowerShell。然后将 JAVA_HOME 设置为 java 安装路径。
在你的情况下,运行
setx JAVA_HOME "D:\Program Files\Java\jdk-11.0.1"
您应该会看到一条消息,内容为“成功:已保存指定的值。
- 然后运行
setx WSLENV "JAVA_HOME/p"
您应该会再次看到成功消息。
- 在 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>
就个人而言,我在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 aCommand '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
中附加以下内容来更新 PATHexport 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"