You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求预装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:29