BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
g.drawLine(80, 30, 120, 70);
g.drawLine(80, 70, 120, 30);
ImageIO.write(img, "png", new File("image.png"));
当用**-Djava.awt.headless=true**运行时,将产生一个映像文件:
当使用**-Djava.awt.headless=false**运行时(并且不使用X窗口服务器),将抛出异常: java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable. 请注意,JVM包含启发式规则,如果java.awt.headless没有显式设置,它会确定该值。例如,在Linux上,如果没有设置DISPLAY环境变量,java.awt.headless会自动变为true。
4条答案
按热度按时间ulydmbyx1#
如果不使用AWT功能,则设置
java.awt.headless=true
对性能没有任何好处。AWT功能是按需加载的。如linked article中所述,无头模式对于访问某些通常委托给图形主机的Java图形功能非常有用:
在设置了headless模式并创建了headless toolkit的示例之后,您的应用程序可以执行以下操作:
Canvas
、Panel
和Swing组件(顶级组件除外java.awt.PrintJob
、java.awt.print.*
和javax.print.*
类进行打印例如,在无头模式下,您可以创建和写入图像文件:
当用**
-Djava.awt.headless=true
**运行时,将产生一个映像文件:当使用**
-Djava.awt.headless=false
**运行时(并且不使用X窗口服务器),将抛出异常:java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
请注意,JVM包含启发式规则,如果
java.awt.headless
没有显式设置,它会确定该值。例如,在Linux上,如果没有设置DISPLAY
环境变量,java.awt.headless
会自动变为true
。pkmbmrz72#
无头模式和非无头模式是不同的,它们有不同的功能。如果你只需要做一些简单的事情,如字体渲染,那么是的,你将能够在无头模式下做。
您可以随时检查JDK源代码的内部,并亲自查看哪些方法依赖于非headless模式。但在我看来,即使性能增益可以忽略不计,最好还是传递
java.awt.headless
(如果您不需要“完整”GUI模式)。任何供应商都可以使用此属性。如果您有完整的GUI,您永远不知道他们是否会执行某些操作。因此,我的经验法则是:对于控制台应用程序和服务器,我总是使用
java.awt.headless
。这不会有什么坏处。8yoxcaq73#
一个可能的好处是,如果您在调用应用程序的同时尝试在窗口中执行其他操作(可能多次调用应用程序),则在应用程序以无头模式运行时,不会中断键盘/鼠标焦点。
至少在Mac上,我在运行脚本时遇到了巨大的问题,脚本每隔几秒钟就重复运行一个java应用程序,同时试图在另一个窗口中编辑。
2ledvvac4#
Headless模式主要适用于没有图形显示的系统,通常是服务器。
许多应用程序使用图形显示来做不一定需要看到的事情,例如绘制图像,然后将其保存到磁盘。
如果你在服务器上运行这样的程序(只使用ssh连接,没有图形端点),在缺省模式下你会得到一个异常,而当你启用headless模式时你会让程序运行。
无头模式本质上意味着虚拟显示,图形组件在通用/透明显示界面上进行其操作,例如,它们在网格上绘制圆,然后当在有头模式中时,结果被实际显示,或者在无头模式中被不同地对待,例如,网格是存储器对象,其被改变以使得其将在真实的显示器上表示绘制的圆,相同的网格可用于诸如将所有内容保存为图像文件之类的任务。
正如其中一条评论所建议的那样,Oracle有很多关于它的details。