尽管“java”命令在 Powershell 中有效,但在 WSL 上找不到命令“java”

尽管“java”命令在 Powershell 中有效,但在 WSL 上找不到命令“java”

这个话题可能是一个常见的话题,但是当我在网上查看时,我没有看到太多与我的情况相关的内容,因为我运行的不是普通的 ubuntu,而是 WSL(适用于 Linux 的 Windows 子系统)。

所以我的问题是我最近从 java 8 切换到 java 17(我需要 java 8 来参加一门课程),但我注意到在 ubuntu 终端上java -version仍然显示openjdk-1.8.(something),而不是jdk-17或类似的东西。

因此,我认为卸载 openjdk 可以解决问题,我这样做了sudo apt-get autoremove openjdk-8-jre。但是,现在java在 ubuntu 终端中输入根本不起作用了,并显示:Command 'java' not found, but can be installed with: ...。但我担心使用这些命令之一安装它会安装新版本的 java,而不是使用已安装的版本。

我已将JAVA_HOME变量设置为java安装目录,即mnt/c/Program Files/Java/jdk-17.0.1,但是Program Files中的空间似乎是一个问题。

我该如何解决这个问题?我通常更喜欢使用 bash 终端而不是 Powershell 或 cmd,因为我更了解这些命令,所以无法在 bash 中使用javajavac对我来说是个问题。谢谢!

答案1

这里有几个关于 WSL 的独特之处。首先,如果您.exe在 Windows 端输入 的名称,但来自 WSL,它将起作用。例如,在 WSL 中打开 Bash 提示符,键入notepad.exe,然后按 Enter。记事本将打开。

在卸载 OpenJDK 8 之前,您已openjdk-8-jre在 WSL 中安装Java 17 安装在 Windows 中。当您java从 Windows 调用时,它足够智能,可以添加.exe,并运行 Java 的 Windows 副本。但是,当您切换到 WSL 时,当您键入 时java,它会运行 Linux 版本。但是,如果您输入(进入 WSL)java.exe,它会从 WSL 启动 Java 的 Windows 版本,原因与记事本的工作方式相同。

如果我想从 WSL 进行 Java 开发,我会完全卸载 Windows 版本的 Java,在 WSL 中安装我想要的 Java 版本(sudo apt update && sudo apt install openjdk-17-jre),然后通过 WSL Java 编译器在 WSL 中进行开发。

答案2

您可以在 WSL 中直接使用java.exe而不是java。我提供了命令,以便您可以

  1. 创建一个新的 java 文件(使用nano <class_name>.java
  2. 编译它(javac.exe <class_name>.java
  3. 运行并查看输出(java.exe <class_name>

我运行了以下命令:

cd /mnt/c/users/adity/desktop 
nano Basic.java
javac.exe Basic.java
java.exe Basic

文件中的代码Basic.java

public class Basic {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

以下是终端的截图: Ubuntu 终端的屏幕截图,其中包含创建 Basic.java、编译和运行它的命令。

相关内容