求预装Swing依赖的Docker镜像:Java Swing程序运行报错
在Docker中运行Java Swing应用的依赖问题
问题详情
我有一个Hello World风格的Java Swing应用,代码如下:
package org.example; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.border.Border; public class HelloWorldSwing { private static void createAndShowGUI() { JFrame jFrame = new JFrame("Hello World Swing Example"); jFrame.setLayout(new FlowLayout()); jFrame.setSize(500, 360); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Hello World Swing"); Border border = BorderFactory.createLineBorder(Color.BLACK); label.setBorder(border); label.setPreferredSize(new Dimension(150, 100)); label.setText("Hello World Swing"); label.setHorizontalAlignment(JLabel.CENTER); label.setVerticalAlignment(JLabel.CENTER); jFrame.add(label); jFrame.setVisible(true); } public static void main(String[] args) { createAndShowGUI(); } }
在Docker中运行该应用时出现如下错误:
Attaching to app-1 app-1 | Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/openjdk-17/lib/libawt_xawt.so: libXext.so.6: cannot open shared object file: No such file or directory app-1 | at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) app-1 | at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384) app-1 | at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228) app-1 | at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170) app-1 | at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389) app-1 | at java.base/java.lang.Runtime.load0(Runtime.java:755) app-1 | at java.base/java.lang.System.load(System.java:1953)
请问是否有人知晓预装所有必要依赖的合适Docker镜像?
解决方案
1. 选择预装X11依赖的Docker镜像
Java Swing依赖X11图形库,官方基础OpenJDK镜像默认不包含这些库,你可以选择以下两种方式:
方式一:基于官方镜像手动安装依赖
以openjdk:17-jdk(Debian基础)为例,编写Dockerfile时安装所需的X11库:
FROM openjdk:17-jdk # 安装Swing运行必需的X11依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libxext6 \ libxrender1 \ libxtst6 \ libxi6 \ && rm -rf /var/lib/apt/lists/* # 复制你的应用jar包到容器内 COPY HelloWorldSwing.jar /app.jar # 启动应用 CMD ["java", "-jar", "/app.jar"]
方式二:使用第三方预装依赖的镜像
已有现成镜像打包了所有必要依赖,无需手动安装:
frolvlad/alpine-java:jdk17-full:基于Alpine Linux,体积较小,适合轻量场景adoptopenjdk/openjdk17:x86_64-ubuntu-jdk-17.0.2_8:基于Ubuntu,兼容性更好,预装了完整的X11依赖
2. 运行容器时的X11转发配置
无论使用哪种镜像,运行容器时都需要配置X11转发,让容器能访问宿主机的显示设备:
# Linux环境下直接运行 docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix your-image-name # macOS环境需先安装XQuartz,然后运行: docker run -e DISPLAY=host.docker.internal:0 your-image-name # Windows环境需安装VcXsrv,然后运行: docker run -e DISPLAY=host.docker.internal:0.0 your-image-name
内容的提问来源于stack exchange,提问作者Mindaugas Jaraminas
相关产品推荐
相关产品推荐

