在Linux(Servicemix)下运行时在工作表上调用autoSizeColumn时崩溃

时间:2011-09-14 07:01:29

标签: java linux crash apache-poi apache-servicemix

我编写了生成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调用结束。

有没有人遇到过这种行为并且知道它是如何引起的以及如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

为了能够计算列宽,POI需要获取正在使用的Font,并要求它依次调整每个字符的大小。在我所知道的所有JVM上,这需要一个图形环境,因为实际的工作由JVM委派给底层的图形系统。

如果你在Windows上,你总是有一个图形系统,所以没关系。在Linux上,如果您在服务器上的命令行上运行,则可能不是。 (虽然Linux作为桌面很好)

如果您在没有运行X服务器的Linux服务器上运行,则需要告诉Java运行“无头”。取自POI AutoSize documentation

  

计算列宽Sheet.autoSizeColumn使用在图形环境不可用时抛出异常的Java2D类。如果图形环境不可用,您必须告诉Java您正在无头模式下运行并设置以下系统属性:   的 java.awt.headless =真

尝试在启动JVM时进行设置,并且我预感到它将解决您的问题(这很可能是由于Java找不到完整的图形环境引起的)

答案 1 :(得分:0)

嗨,我遇到了类似的问题。我没有任何崩溃,但在我的开发环境(Windows)中,autosizecolumn工作了。在生产环境(类Unix)上它没有用。我把系统属性 java.awt.headless = true 但我仍然遇到了问题。我解决了this solution之后但我添加了所有Arial Family字体。希望它可以帮助任何人。