在 Windows 机器上,我有一个名为
paths.sh
的 bash 脚本,它列出了 JAVA_HOME
目录中的 Java 文件
#!/bin/bash
echo "Current working directory: $(pwd)"
echo "JAVA_HOME: $JAVA_HOME"
echo "Accessing path: $JAVA_HOME/bin/java"
ls -l "$JAVA_HOME/bin/java" || echo "Failed to access java"
当我直接在 Git bash 中运行它时,它工作正常,我得到:
$ ./src/test/java/javaToJs/paths.sh
Current working directory: /g/ws/ws-shared
JAVA_HOME: /g/Java/jdk21
Accessing path: /g/Java/jdk21/bin/java
-rwxr-xr-x 1 Admin 197608 54384 Sep 26 2023 /g/Java/jdk21/bin/java
在我的 build.gradle 中,我有一个 gradle 任务来在构建时自动运行脚本
task paths(type: Exec) {
workingDir 'G:/WS/ws-shared'
commandLine 'bash', './src/test/java/javaToJs/paths.sh'
}
这行不通。它在目录路径中添加了一个
/mnt
(根据 AI,这是由于适用于 Linux 的 Windows 子系统),并且找不到要列出的 Java 文件
$ gradle paths
> Task :paths
Current working directory: /mnt/g/WS/ws-shared
JAVA_HOME: /mnt/g/Java/jdk21
Accessing path: /mnt/g/Java/jdk21/bin/java
ls: cannot access '/mnt/g/Java/jdk21/bin/java': No such file or directory
Failed to access java
我在这个简单的过程中尝试了任意数量的突变和排列,包括从
/mnt
中删除 JAVA_HOME
。我每次都会遇到同样的问题。例如,没有 /mnt
ls: cannot access '/g/java/jdk21/bin/java': No such file or directory
gradle 任务如何添加
/mnt
并失去对给定目录的访问权限?
UPDATE: The plot thickens
在我卸载适用于 Linux 的 Windows 子系统并重新启动后。现在,当我运行 gradle 任务时,我得到:
$ gradle paths
Starting a Gradle Daemon, 4 incompatible and 1 stopped Daemons could not be reused, use --status for details
> Task :paths FAILED
Windows Subsystem for Linux has no installed distributions.
Use 'wsl.exe --list --online' to list available distributions
and 'wsl.exe --install <Distro>' to install.
Distributions can also be installed by visiting the Microsoft Store:
https://aka.ms/wslstore
Error code: Bash/Service/CreateInstance/GetDefaultDistro/WSL_E_DEFAULT_DISTRO_NOT_FOUND
FAILURE: Build failed with an exception.
通过
bash
的 gradle
命令正在使用 WSL。就像这篇文章我必须重新初始化 WSL2 层,以管理员身份打开 PowerShell 进入我的 WSL 并为其安装 JVM。
sudo apt install openjdk-21-jdk
现在我可以找到 JAVA_HOME 路径
readlink -f $(which java)
并设置它
JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
如果我将其设置为我的 JAVA_HOME,那么我可以在我的
bash
中运行
gradle task
命令
注意:这意味着我无法让 WSL 使用我的本地 Windows JVM
bash
。