Search code examples
javalinuxtomcatjfreechartheadless

Java Headless Exception after setting -Djava.awt.headless=true


I am using:

Linux Debian 6, Java 1.6.29 and Tomcat 6

I've seen many posts about it explaining that java.awt requires X11 libraries..etc., but they are not solving the problem.

I set -Djava.awt.headless=true in my box and I worked around the first problem of the headless environment, now I am getting:

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)
...

I know by doing this I just told java that there is no monitor (and in fact running a standalone java program to check if the environment is headless it does return true). So is it anything to do with the Linux environment like setting the DISPLAY env variable?

I would appreciate your help,

Thanks.


Solution

  • Thanks for your reply.

    Since you gave me that I've been trying to text it. Still doesn't work in the sense that: is now not throwing that exception anymore, but creating a blank image for some reason.

    So I went from this:

    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();
            }
       }
    

    to the following (getting rid of extends ApplicationFrame) and use the example you gave me:

    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();
            }
       }
    

    in the log it complains about ImageIO.write(bufferedImage, "gif", new FileOutputStream(path+getFilename())); giving this error (while the file is there!):

    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)
    

    Any clue?