设置-Djava.awt.headless = TRUE后的Java无头异常(Java Headle

2019-09-16 14:08发布

我在用:

Linux的Debian的6,爪哇29年6月1日和Tomcat 6

我已经看到了很多关于它的帖子解释java.awt需要X11 libraries..etc,但他们没有解决问题。

我设置-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环境变量?

我会感激你的帮助,

谢谢。

Answer 1:

正如你在读http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ ,如果不支持一个显示设备,键盘或鼠标的许多组件都受到影响。 与帆布,面板,图像组件的方法不需要抛出HeadlessException的 ,因为这些组件可以给出空同行和轻量级组件处理。

所以JFrame的是投掷HeadlessException的组件。

如果你想生成的无头环境的JFreeChart图表,这个链接可以帮助你: http://javaevangelist.blogspot.com.es/2010/11/creating-charts-on-headless-systems.html 。



Answer 2:

-Djava.awt.headless=false

上面添加它的工作原理一种享受:)



Answer 3:

您可能需要安装一个VNC服务器(或类似的东西),因为在这个论坛讨论的主题 。

附录:如果不想保存图表图像的文件,写入使用的一个服务器的输出流writeChartAsPNG()方法,如建议在这里 。



Answer 4:

脱下任何从ApplicationFrame扩展将解决这个问题。 在大多数Tomcat的部署环境中,我们通常没有X11 Windows软件包。 我们需要的不是一个ApplicationFrame(JFram)将使用旧的AWT对象。

我的例子

BloodChart(String title)  extends ApplicationFrame 

修改 - >

BloodChart(String title)

它的工作对我来说,祝你好运!



Answer 5:

感谢您的回复。

既然你给了我,我一直在试图文字吧。 仍然没有在这个意义上的工作:现在没有抛出该异常了,但创造某种原因空白图像。

所以我从这个去:

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)

任何线索?



文章来源: Java Headless Exception after setting -Djava.awt.headless=true