我正在使用:
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变量?
感谢您的帮助,
感谢。
答案 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)
答案 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)
有任何线索吗?