在没有Graphics Environment的情况下启动java应用

当我在docker中运行我的应用程序时,出现以下Javaexception。

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桌面进行testing。 如果我在Ubuntu桌面上安装了Java应用程序(没有docker),它按预期工作。 这是docker问题还是我访问亚马逊云Ubuntu的方式?

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

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

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

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

接下来作为@SimonlucaLandi,build议你可以运行一个无头版本

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

以下是一些更相关的参考资料,如果您需要转到X11显示版本,您可以参考

如何从Docker容器中查看GUI应用程序

Docker容器中的X11转发GUI应用程序

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