我已经编写了生成excel的模块,并将其部署在Servicemix下。在Windows环境下一切正常,但在Linux下Servicemix在以下调用中意外崩溃:
for (short i=0;i<=3;i++) {
log.trace("AutoSize column {}", i);
worksheet.autoSizeColumn(i);
}我使用的是POI4.2版-最终版,Java4.2,FuseESB 5.0。但是,没有hs_err*.pid文件。Servicemix日志在第一次autoSizeColumn调用时结束。
有没有人遇到过这样的行为,并知道它是如何引起的,以及如何解决这个问题的?
发布于 2011-09-14 17:16:00
为了能够计算列宽,POI需要获得正在使用的字体,并要求它依次调整每个字符的大小。据我所知,在所有JVM上,这都需要一个图形环境,因为JVM将实际工作委托给底层图形系统。
如果你在Windows上,你总是有一个图形系统,所以这是很好的。在Linux上,如果您在服务器上的命令行上运行,则可能不会。(不过,Linux作为台式机是可以的)
如果您在没有运行X服务器的linux服务器上运行,则需要告诉Java运行"headless“。取自POI AutoSize documentation
用于计算列宽的
Sheet.autoSizeColumn使用Java2D类,这些类在图形环境不可用时抛出异常。如果图形环境不可用,您必须告诉Java您正在无头模式下运行,并设置以下系统属性:java.awt.headless=true
尝试在启动JVM时设置它,我有预感它会解决您的问题(这很可能是由于Java找不到完整的图形环境造成的)
发布于 2012-09-21 00:36:17
嗨,我也遇到过类似的问题。我没有任何崩溃,但在我的开发环境(Windows)上,autosizecolumn可以工作。在生产环境(类Unix)上,它不起作用。我放置了系统属性java.awt.headless=true,但是我仍然有这个问题。我解决了跟随this solution的问题,但我添加了所有的Arial系列字体。希望这对任何人都有帮助。
https://stackoverflow.com/questions/7412457
复制相似问题