虚假的X11显示器?

15

我有一个使用AWT的Java程序,我希望在无头系统上运行。该程序的显示仅用于显示统计信息。当程序运行结束后,它会退出。该显示屏没有用户交互。该程序创建一个输出文件,我在我的构建系统中使用。

有没有办法让Java程序在没有配置X11显示的情况下运行?我可以强制Java在不尝试显示任何内容的情况下运行该程序吗?由于我没有源代码(只有.jar文件),所以无法对源代码进行修改。

你有什么想法来解决这个问题吗?

7个回答

31

这里的根本问题是如何在没有X服务器的情况下运行Java应用程序;提供“虚假”的X服务器只是其中一种选择。在Java 1.4及以上版本中,您可以执行以下操作:

java -Djava.awt.headless=true

这使得使用AWT的应用程序可以在无需X服务器的无头系统上运行。


这看起来像是最佳解决方案。 - hhafez
2
请注意,这可能并不足够。例如,即使使用此标志,我仍然会得到以下堆栈跟踪,用于尝试使用JFrame的程序: Exception in thread "main" java.awt.HeadlessException at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159) at java.awt.Window.<init>(Window.java:431) at java.awt.Frame.<init>(Frame.java:403) at javax.swing.JFrame.<init>(JFrame.java:207) - Scott Bale
@ScottBale,我同意这并不一定足够。另一方面,我也认为这是开始的正确地方。 - Charles Duffy

16

我曾经用它来运行一个无头的openoffice,它表现得非常好。 - Olivier
嗯,下面提出的java -Djava.awt.headless=true解决方案比安装一些第三方软件更有意义。 - stephen mulcahy
Xvfb几乎不算第三方软件 - 它是标准X11发行版的一部分。 - user57368
是的。当-Djava.awt.headless=true无法正常工作时,这绝对是正确的做法。尽管存在资源消耗差异,但我认为-Djava.awt.headless=true是开始的正确位置。 - Charles Duffy

16
你可以使用vncserver。
vncserver :1001
export DISPLAY=localhost:1001
java..

额外的好处是,您实际上可以使用vncserver“以防万一”查看GUI界面。


6

可以使用低分辨率和色彩深度来运行Xvnc。


愚蠢的负评。Xvnc 的效果与 Xvfb 差不多,只是如果最终需要进行调试,你可以连接到它。 - Joshua

1

正如Charles Duffy所提到的,传统的方法是告诉Java进入无头模式。

请注意,您始终可以在Eclipse中挂载jar并使用jad+jadclipse查看它实际执行的操作,如果需要,甚至可以通过将另一个类文件放在类路径的“前面”来覆盖类。

如果程序使用Java2D,则可能与之相关的设施是较新版本的Java使用X11服务器中的优化以实现更快的渲染。这本身可能是将连接到高性能图形卡的X11服务器专用于图形处理的原因。


0

我能够通过命令行参数在OpenJFX中获得无头模式

-Dglass.platform=Monocle -Dmonocle.platform=Headless -Dprism.order=sw

0

我过去曾经非常成功地使用PJA库,但似乎它们不再维护了,但是我只是想运行...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接