在没有图形环境的情况下启动 java 应用程序

Posted

技术标签:

【中文标题】在没有图形环境的情况下启动 java 应用程序【英文标题】:Start java application without Graphics Environment 【发布时间】:2017-08-06 10:46:25 【问题描述】:

当我从 docker 中运行我的应用程序时,出现以下 Java 异常。

Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
        at java.awt.Window.<init>(Window.java:536)
        at java.awt.Frame.<init>(Frame.java:420)
        at java.awt.Frame.<init>(Frame.java:385)
        at javax.swing.JFrame.<init>(JFrame.java:189)
        at mantra.mfs100.test.MFS100Test.<init>(MFS100Test.java:67)
        at mantra.mfs100.test.MFS100Test$8.run(MFS100Test.java:450)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我的 docker 文件看起来像这样...

# cat Dockerfile
FROM openjdk:8
COPY . /usr/src/myapp
WORKDIR "x64/mfs100_9.0.2.2_x86_redist/"
RUN "./install.sh"

WORKDIR /usr/src/myapp

CMD ["java", "-jar", "/usr/src/myapp/dist/myap.jar"]

我正在使用亚马逊提供的 Ubuntu Desktop 进行测试。如果我在 Ubuntu 桌面(没有 docker)上安装 Java 应用程序,它会按预期工作。这是docker问题还是我访问亚马逊云ubuntu的方式?

【问题讨论】:

【参考方案1】:

你应该设置无头模式,通过java.awt.headless=true,使用类似这样的东西:

CMD ["java", "-Djava.awt.headless=true", "-jar", "/usr/src/myapp/dist/myap.jar"]

【讨论】:

【参考方案2】:

有多种方法可以做到这一点。最常见的方式是将你的主机 X11 显示共享到 docker 容器

docker run -d \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /etc/localtime:/etc/localtime \
    -e DISPLAY=unix$DISPLAY \
    <yourcontainer>

接下来作为@SimonlucaLandi,建议您可以运行无头版本

CMD ["java", "-Djava.awt.headless=true", "-jar", "/usr/src/myapp/dist/myap.jar"]

下面是一些比较相关的参考资料,如果你需要去X11显示版本可以参考

How to view GUI apps from inside a docker container

X11 forwarding of GUI app in Docker container

https://medium.com/@dimitris.kapanidis/running-gui-apps-in-docker-containers-3bd25efa862a

【讨论】:

以上是关于在没有图形环境的情况下启动 java 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在不重新启动应用程序的情况下设置 Heroku 环境变量

docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar

允许在立即启用 JMX 监控的情况下重新启动 Java 应用程序

debian11图形安装死机安装卡死

linux图形环境小记

我的应用程序启动时如何在没有预览的情况下从相机拍照?