我写了一个生成excel的模块,并将其部署在Servicemix下。在Windows环境下一切正常,但在Linux下,Servicemix在以下调用时意外崩溃:
for (short i=0;i<=3;i++) {
log.trace("AutoSize column {}", i);
worksheet.autoSizeColumn(i);
}
字符串
我使用POI版本4.2-FINAL,FuseESB 4.2,Java 5.0。但是,没有hs_err*.pid文件。Servicemix日志在第一次调用autoSizeColumn时结束。
有没有人遇到过这种行为,知道它是如何引起的,以及如何解决这个问题?
4条答案
按热度按时间r6vfmomb1#
为了能够计算列宽,POI需要获得正在使用的字体,并要求它依次调整每个字符的大小。在我所知道的所有JVM上,这需要图形环境,因为实际工作由JVM委托给底层图形系统。
如果你使用的是Windows系统,那么你总是有一个图形系统,这很好。在Linux上,如果你是在服务器上的命令行上运行,那么你可能就没有图形系统了。(不过,Linux作为桌面系统是可以的)
如果你运行在一个没有X服务器的Linux服务器上,你需要告诉Java运行“headless”。
要计算列宽,Sheet.autoSizeColumn使用Java2D类,如果图形环境不可用,则会抛出异常。如果图形环境不可用,则必须告诉Java您正在以无头模式运行,并设置以下系统属性:java.awt.headless=true
尝试在启动JVM时设置它,我有预感它会修复您的问题(这很可能是由于Java没有找到完整的图形环境造成的)
eqoofvh92#
我们还没有测试它,因为它还没有发布,但从POI 5.2.3开始,有一个布尔系统属性可以帮助:
org.apache.poi.ss.ignoreMissingFontSystem
指示Apache POI忽略由于缺少字体而导致的一些错误,从而允许执行更多功能,即使没有安装字体。注意:由于无法使用默认值,某些功能仍然无法使用,例如渲染幻灯片,绘图等。
ckx4rj1h3#
嗨,我遇到了一个类似的问题。我没有遇到任何崩溃,但在我的开发环境(Windows)中,autosizecolumn工作。在生产环境(类Unix)中,它不工作。我把系统属性java.awt.headless=true但我仍然有问题。我解决了以下this solution,但我添加了所有的Arial家族字体。希望它能帮助任何人。
baubqpgj4#
我在迁移服务器(OpenJDK 1.8,Rocky Linux 9)时也遇到了同样的问题。
无头设置对我没有帮助(
java.awt.headless=true
)。但是安装fontconfig解决了这个问题。我假设这个软件包带有默认字体。字符串