在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.0,networkingMode=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
常见问题
- 运行后没有弹出窗口
- 检查是否设置了
DISPLAY=localhost:0.0(networkingMode=mirrored)或DISPLAY=$(ip route show | awk '/default/ {print $3}'):0.0(networkingMode=NAT) - 检查是否运行了x11客户端(VcXsvr或WSLg)
- 检查是否设置了
- 提示
xxx has been compiled by a more recent version of the Java Runtime- 表明软件依赖更高版本的java运行时,需要在singularity容器定义中配置更高版本的openjdk
- 提示
Error loading shared library xxx.so- 表明缺乏某个动态链接库,需要在singularity容器定义中添加安装对应的库

浙公网安备 33010602011771号