WSL2运行JavaFX报错Unable to open DISPLAY问题求助
问题根因
- 最核心的错误是
.bashrc中DISPLAY变量配置冲突:你通过resolv.conf获取到Windows宿主机IP后已经设置了正确的DISPLAY值,后续又新增了DISPLAY=:0.0的配置强行覆盖了之前的正确值,导致JavaFX尝试连接WSL2本地的X服务器,而WSL2本身默认没有运行X服务,因此抛出无法打开DISPLAY的异常。 - VcXsrv配置不符合要求,未开启访问权限或被Windows防火墙拦截。
- VS Code运行Java程序时未正确加载
.bashrc中的环境变量,使用了错误的DISPLAY值。 - WSL2系统缺失JavaFX运行GUI所需的X11、GTK依赖库。
修复步骤
- 修正
.bashrc配置
删除.bashrc末尾多余的两行配置:
DISPLAY=:0.0 export DISPLAY
仅保留以下两行即可:
export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0 export LIBGL_ALWAYS_INDIRECT=1
执行source ~/.bashrc使配置生效,运行echo $DISPLAY验证,输出应为[Windows宿主机IP]:0.0格式,而非单纯的:0.0。
- 调整VcXsrv启动配置
- 启动VcXsrv时,「Display settings」页选择Multiple windows,Display number填0
- 「Client startup」页选择Start no client
- 「Extra settings」页必须勾选Disable access control,否则WSL2的访问请求会被拒绝
- 启动时若弹出Windows防火墙提示,需允许VcXsrv在专有网络、公用网络下通信,若之前未勾选,可进入Windows Defender防火墙高级设置,找到VcXsrv的入站规则,放开所有权限。
- 安装WSL2依赖库
执行以下命令安装JavaFX运行所需的系统依赖:
sudo apt update && sudo apt install -y libxext-dev libxrender-dev libxtst-dev libgtk-3-0 x11-apps
安装完成后运行xeyes测试X11连通性,若能弹出带眼睛的小窗口,说明X服务链路正常。
- 修正VS Code launch.json配置
在Launch App的配置项中新增环境变量字段,确保Java运行时读取到正确的DISPLAY值:
{ "type": "java", "name": "Launch App", "request": "launch", "vmArgs": "--module-path /home/azazel/javafx-sdk-17.0.1/lib --add-modules javafx.controls,javafx.fxml", "mainClass": "App", "projectName": "javafx_ef467b58", "env": { "DISPLAY": "${env:DISPLAY}" } }
若仍异常,可直接将DISPLAY的值写死为第一步验证得到的[Windows宿主机IP]:0.0。
额外可选方案:若你使用的是较新版本的WSL2,已自带WSLg图形支持,无需安装VcXsrv,只需删除.bashrc中所有自定义的DISPLAY相关配置,系统会自动设置正确的DISPLAY变量,直接运行JavaFX程序即可。
内容的提问来源于stack exchange,提问作者Kai Strachan
相关产品推荐
相关产品推荐

