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

im9ewurl  于 2023-02-18  发布在  Linux
关注(0)|答案(4)|浏览(409)

我尝试让WSL识别我的Windows安装环境变量JAVA_HOME。我附加了我的bashrc和Windows环境变量中的内容沿着cmd和bash的输出。x1c 0d1x

在我的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

冲洗输入/输出:

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

我已经在这个问题上停留了一段时间,不能弄清楚它或找到一个工作的解决方案在线。谢谢!

uurity8g

uurity8g1#

正如Biswapriyo建议的那样,您应该使用WSLENV。
1.打开PowerShell,然后将JAVA_HOME设置为java安装路径。
1.在您的情况下,请运行setx JAVA_HOME "D:\Program Files\Java\jdk-11.0.1"
您应该会看到一条消息,内容为“SUCCESS:指定的值已保存””。
1.然后运行setx WSLENV "$env:JAVA_HOME/p"
您应该会再次看到成功消息。
1.在WSL bash提示符中键入“env”。
此时您应该看到JAVA_HOME设置正确。
注意:如果步骤2不起作用,您可能需要将路径更改为JAVA_HOME以包含\bin文件夹。

bis0qfac

bis0qfac2#

**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作为路径变量。

在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,和我的所有其他开发工具设置在我的第二个硬盘,这不是一个系统驱动器,确保您的位置匹配您的JAVA_HOME路径在Windows中。
例如,如果在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-WSL 1的一个特别大的好处,因为它可以(几乎)完美地与Windows文件系统交互。

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

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

uurity8g

uurity8g3#

我最初让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

问题是我试图在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.

然后获取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"
q8l4jmvw

q8l4jmvw4#

由于我从来没有能够在两个系统之间轻松地共享变量,我创建了一个简单的bash函数,它可以轻松地检索(和定义,如果要求)任何Windows环境变量。它还照顾路径,使他们从Win32转换为Un* x一样。
我将以下内容添加到/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}"
}

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

相关问题