设置-Djava.awt.headless = true后的Java Headless Exception

时间:2012-04-16 08:08:51

标签: java linux tomcat jfreechart headless

我正在使用:

Linux Debian 6, Java 1.6.29和 Tomcat 6

我看过很多关于它的帖子,解释java.awt需要X11库等等。但是他们没有解决问题。

我在我的盒子里设置了-Djava.awt.headless = true,我解决了无头环境的第一个问题,现在我得到了:

java.awt.HeadlessException
java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
java.awt.Window.(Window.java:432)
java.awt.Frame.(Frame.java:403)
javax.swing.JFrame.(JFrame.java:202)
org.jfree.ui.ApplicationFrame.(ApplicationFrame.java:65)
...

我知道通过这样做我只是告诉java没有监视器(事实上运行一个独立的java程序来检查环境是否无头,它确实返回true)。那么与Linux环境有什么关系,比如设置DISPLAY env变量?

感谢您的帮助,

感谢。

5 个答案:

答案 0 :(得分:5)

正如您在http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/中所读到的,如果不支持显示设备,键盘或鼠标,许多组件都会受到影响。与 Canvas,Panel和Image组件相关的方法不需要抛出HeadlessException ,因为这些组件可以被赋予空对等并被视为轻量级组件。

因此JFrame是抛出HeadlessException的组件。

如果您想在无头环境中使用jfreechart生成图表,此链接可能会对您有所帮助:http://javaevangelist.blogspot.com.es/2010/11/creating-charts-on-headless-systems.html

答案 1 :(得分:2)

-Djava.awt.headless=false

在上面添加它可以治疗:)

答案 2 :(得分:1)

您可能需要安装VNC服务器(或类似的东西),如论坛thread中所述。

附录:不是将图表图像保存为文件,而是使用writeChartAsPNG()方法之一写入服务器的输出流,如建议here

答案 3 :(得分:1)

ApplicationFrame 中取消任何扩展都可以解决此问题。 在大多数Tomcat部署环境中,我们通常没有X11 Windows软件包。 我们不需要使用旧的AWT对象的 ApplicationFrame(JFram)

我的例子

BloodChart(String title)  extends ApplicationFrame 

更改为 - >

BloodChart(String title)

这对我有用,祝你好运!

答案 4 :(得分:0)

感谢您的回复。

既然你告诉我,我一直在尝试发短信。仍然不起作用:现在不再抛出异常了,但出于某种原因创建了一个空白图像。

所以我离开了这个:

public BarChartGenerator(org.qcri.power.ws.client.Server oServer, ServerStatistics oServerStat, List lVMs, String path) extends ApplicationFrame {

        System.setProperty("java.awt.headless", "true");
        boolean headless = GraphicsEnvironment.isHeadless();
        System.out.println("Headless: " + headless);
        Toolkit tk = Toolkit.getDefaultToolkit();
        tk.beep();

        // generate dataset
        final CategoryDataset dataset = createDataset(lVMs);
        setChart(createChart(oServer, oServerStat, lVMs, dataset));

        // create PNG of the chart...
        setFilename("chart_server"+oServer.getHost()+"_"+System.currentTimeMillis()+".gif");

        File fImageFile = new File(path+filename);
        try {
            ChartUtilities.saveChartAsPNG(fImageFile, chart, PowerInterface.CHART_WIDTH, PowerInterface.CHART_HEIGHT);
        } catch (Exception e) {
            e.printStackTrace();
        }
   }

以下(摆脱extends ApplicationFrame)并使用你给我的例子:

public BarChartGenerator(org.qcri.power.ws.client.Server oServer, ServerStatistics oServerStat, List lVMs, String path) {

        System.setProperty("java.awt.headless", "true");
        boolean headless = GraphicsEnvironment.isHeadless();
        System.out.println("Headless: " + headless);
        Toolkit tk = Toolkit.getDefaultToolkit();
        tk.beep();

        // generate dataset
        final CategoryDataset dataset = createDataset(lVMs);
        setChart(createChart(oServer, oServerStat, lVMs, dataset));

        // create PNG of the chart...
        setFilename("chart_server"+oServer.getHost()+"_"+System.currentTimeMillis()+".gif");

        try {
            BufferedImage bufferedImage = getChart().createBufferedImage(PowerInterface.CHART_WIDTH, PowerInterface.CHART_HEIGHT);
            ImageIO.write(bufferedImage, "gif", new FileOutputStream(path+getFilename()));
        } catch (Exception e) {
            e.printStackTrace();
        }
   }

在日志中抱怨ImageIO.write(bufferedImage, "gif", new FileOutputStream(path+getFilename()));发出此错误(文件在那里!):

javax.imageio.IIOException: Can't create output stream!
        at javax.imageio.ImageIO.write(ImageIO.java:1560)
        at org.qcri.power.util.BarChartGenerator.<init>(BarChartGenerator.java:106)

有任何线索吗?