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

你说的曾经没有我的故事 提交于 2019-12-12 10:13:57

问题


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.


回答1:


As you can read in http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/, many components are affected if a display device, keyboard or mouse is not supported. Methods related to Canvas, Panel, and Image components do not need to throw a HeadlessException because these components can be given empty peers and treated as lightweight components.

So the JFrame is the component throwing the HeadlessException.

If you want to generate charts with jfreechart in a headless environment, this link may help you: http://javaevangelist.blogspot.com.es/2010/11/creating-charts-on-headless-systems.html.




回答2:


-Djava.awt.headless=false

add above it works a treat :)




回答3:


You may need to install a VNC server (or something similar), as discussed in this forum thread.

Addendum: Instead of saving the chart image as a file, write to the server's output stream using one of the writeChartAsPNG() methods, as suggested here.




回答4:


Take off any extends from ApplicationFrame will solve this problem. In most Tomcat deployment environments ,we usually has no X11 Windows package. we needn't a ApplicationFrame (JFram) which will use old AWT objects.

My example

BloodChart(String title)  extends ApplicationFrame 

changes to ->

BloodChart(String title)

It's work for me , good luck!




回答5:


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?



来源:https://stackoverflow.com/questions/10170609/java-headless-exception-after-setting-djava-awt-headless-true

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!