2

我在用:

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)。那么设置 DISPLAY 环境变量与 Linux 环境有什么关系吗?

我会很感激你的帮助,

谢谢。

4

5 回答 5

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

于 2012-04-16T08:14:30.793 回答
2
-Djava.awt.headless=false

在上面添加它是一种享受:)

于 2012-07-10T14:20:43.157 回答
1

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

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

于 2012-04-16T18:24:05.670 回答
1

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

我的例子

BloodChart(String title)  extends ApplicationFrame 

更改为 ->

BloodChart(String title)

这对我有用,祝你好运!

于 2012-12-12T13:24:16.370 回答
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)

有什么线索吗?

于 2012-04-17T06:33:49.257 回答