我试图让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输入/输出:
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
我已经坚持了一段时间,无法解决问题或无法在线找到可行的解决方案。谢谢!
答案 0 :(得分:2)
按照Biswapriyo的建议,您应该使用WSLENV。
打开PowerShell。然后将JAVA_HOME设置为您的Java安装路径。
以您的情况运行setx JAVA_HOME "D:\Program Files\Java\jdk-11.0.1"
您应该看到一条消息,内容为:“成功:指定的值已保存。
setx WSLENV "JAVA_HOME/p"
您应该再次看到成功消息。
此时您应该看到正确设置了JAVA_HOME。
注意:如果第2步不起作用,则可能要更改JAVA_HOME的路径以包含“ \ bin”文件夹。
答案 1 :(得分:1)
TL; DR::在WSL中,由于它是Windows二进制文件,因此必须使用javac.exe
。即使正确设置了路径,仅键入javac
也不起作用。如果这样不起作用,请尝试在../bin
变量的末尾添加JAVA_HOME
。
有一种更简单的方法可以使Windows和WSL利用相同的JavaSDK二进制文件,您只需要先进行一些设置即可。最好的是,如果Windows上安装了JavaSDK,则不需要。Linux二进制文件。
在WSL中,列出PC上的符号链接:
ls -l /mnt
如果root
拥有任何驱动器,请在/mnt/c/Users/<UserName>
中执行WSL开发工作
我个人在Windows中创建一个开发目录,并在WSL中向该目录添加一个符号链接:
ln -s /mnt/d/dev/environment/ ~/dev
cd dev
现在将您带到您的开发目录。
从任何目录打开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环境变量:
放置下一行代码的最佳位置是您的.bashrc
文件中,但是如果您设置了./bash_profile
或/etc/profile
结构,则可以将其放置在这里。 / p>
# 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 / cmd:
javac GetStringLength.java
java GetStringLength
WSL:
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分钟的时间进行设置,并成为交叉编译和总体易用性的救星。
答案 2 :(得分:0)
由于我一直无法轻松地在两个系统之间共享变量,因此创建了一个简单的bash函数,该函数可以轻松检索(并定义(如果要求))任何Windows Environment变量。 它还照顾路径,使它们从Win32转换为Un * x-line。
我将此添加到了/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 paths\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}"
}
我要做的就是显示winenv PROGRAMFILES
(例如)
或者,如果我希望导出它,则只需在变量名之前 之前添加{-{1}}中的-d参数即可。