在WSL2中用singularity运行java图形界面

在工作过程中需要在windows下运行一个旧版本的java图形界面程序。
由于兼容性问题,该程序需要旧版本的java运行时(openjdk-8)才能打开。
为了一个老软件专门安装一个全局运行时显然十分不便。是否有一种便捷、独立又灵活的运行时方案呢?我们可以用WSL2下的singularity容器配合Windows下的X11客户端来实现。

在WSL下创建singularity容器

保存以下纯文本文件openjdk.def

Bootstrap: docker
From: alpine:latest

%post
    apk add --no-cache openjdk8-jre libxext

用singularity构建映像

singularity build --fakeroot /path/to/openjdk8.sif openjdk8.def

在Windows下配置X11客户端

为了在Windows下运行Linux图形界面程序,需要在Windows下配置X11客户端。WSLg和VcXsvr分别是WSL原生和第三方开源的Windows X11方案。和VcXsvr相比,WSLg的运行时更加庞大和复杂,本文使用VcXsvr作为运行图形界面的X11客户端。

在Windows下安装VcXsvr

保存以下纯文本文件config.xlaunch

<?xml version="1.0" encoding="UTF-8"?>
<XLaunch WindowMode="MultiWindow" ClientMode="NoClient" LocalClient="False" Display="-1" Clipboard="True" ClipboardPrimary="True" ExtraParams="" Wgl="True" DisableAC="True" XDMCPTerminate="False"/>

双击打开,可以在任务栏托盘区域看到VcXsvr图标,表明X11客户端正在运行

利用映像运行java程序

在WSL中启动图形界面程序前,需要指定DISPLAY变量。WSL1和networkingMode=mirrored模式下的WSL2需要将DISPLAY设置为localhost:0.0networkingMode=NAT模式下的WSL2则需要将DISPLAY设置为宿主机IP(可以通过ip route show | awk '/default/ {print $3}'获取)

DISPLAY=localhost:0.0 singularity exec /path/to/openjdk8.sif java -jar /path/to/java/program.jar

常见问题

  1. 运行后没有弹出窗口
    • 检查是否设置了DISPLAY=localhost:0.0networkingMode=mirrored)或DISPLAY=$(ip route show | awk '/default/ {print $3}'):0.0networkingMode=NAT
    • 检查是否运行了x11客户端(VcXsvr或WSLg)
  2. 提示xxx has been compiled by a more recent version of the Java Runtime
    • 表明软件依赖更高版本的java运行时,需要在singularity容器定义中配置更高版本的openjdk
  3. 提示Error loading shared library xxx.so
    • 表明缺乏某个动态链接库,需要在singularity容器定义中添加安装对应的库
posted @ 2026-09-21 19:02  Fan-iX  阅读(5)  评论(0)    收藏  举报