抱歉,我很乐意在做出回答之前发表更多评论,看看我是否走在正确的轨道上。但是,由于这里的信息太多,我将尝试在这里为您提供答案。
虽然它是一个虚拟环境,但默认情况下,WSL 提供了几个“Windows 互操作”功能,允许它:
- 自动挂载 Windows 驱动器
/mnt/{c,d,...}
- 将 Windows 路径附加到 Linux 路径
- 在 Linux 中运行 Windows 可执行文件
- 与 Linux 共享 Windows 环境变量(尽管默认情况下不会发生这种情况)
我不能确定(自从我使用 Rails 以来已经很久很久了),但它看起来像是在app_loader.rb
检查路径中 Java 目录的权限。它可能使用了一些逻辑,例如“检查每个路径条目并在其中查找一个java
或java.exe
。如果找到,请检查权限”。 或类似的东西。这意味着上面的(2)和(3)可能会混淆它。
您可以使用 看到这一点which java.exe
,它可能会返回一个 Windows 路径。或者运行notepad.exe
,这将从 Linux/WSL 中启动 Windows 记事本可执行文件(神奇!)。
这些都是非常有用的功能,所以我不想完全禁用它们,但这是找出问题所在的最简单方法。/etc/wsl.conf
使用以下内容创建一个:
[interop]
enabled=false
appendWindowsPath=false
退出您的 WSL 实例,然后:
- (从 PowerShell、CMD 或 Windows 开始)运行
wsl --list --verbose
以查看您的发行版的名称(最有可能Ubuntu
)
- 同样,运行
wsl --terminate <distro>
以终止该分发。
- 重新启动您的 WSL 实例
- 尝试运行
/mnt/c/Windows/system32/notepad.exe
(假设正常C:\Windows
安装)(应该失败,因为互操作被禁用)
- 尝试
which notepad.exe
(应该失败,因为不应再将 Windows 路径附加到 Linux 路径)
- 尝试再次启动您的 Rails 开发服务器 - 可能会工作(可能不会,我很容易对这里的根本原因弄错)
如果它确实有效,那么您可以尝试使用几种侵入性较小的方法来纠正这种情况,而不是完全禁用这些功能:
- 如果您打算只使用 WSL 进行开发,那么您可以删除 Windows JDK。
- 或者至少从 Windows 的 PATH 中删除 Windows JDK。
- 或者,如果你想保持它安装在 Windows 路径中,你可以有一个 shell 启动文件(例如
.bashrc
),它只在 WSL 中从路径中删除它。我将向您指出这个问题,其中包含多种技术。
- 或者你可以保留
appendWindowsPath=false
在你的/etc/wsl.conf
,然后在你的启动配置中手动添加你想要的路径。