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

问题描述 投票:0回答:4

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

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

java linux crash apache-poi apache-servicemix
4个回答
6
投票

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

如果您使用的是 Windows,那么您始终拥有图形系统,所以这很好。在 Linux 上,如果您在服务器上的命令行上运行,则可能不会。 (Linux 作为桌面也不错)

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

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

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


2
投票

我们尚未测试它,因为它尚未发布,但自 POI 5.2.3 以来,有一个布尔系统属性可以提供帮助:

org.apache.poi.ss.ignoreMissingFontSystem

指示 Apache POI 忽略由于缺少字体和 因此即使没有字体也可以执行更多功能 安装。注意:某些功能仍然无法实现,因为 不能使用默认值,例如渲染幻灯片、绘图...


1
投票

嗨,我遇到了类似的问题。我没有发生任何崩溃,但在我的开发环境(Windows)上,autosizecolumn 起作用了。在生产环境(类Unix)上它不起作用。我设置了系统属性 java.awt.headless=true 但问题仍然存在。我解决了以下这个解决方案,但我添加了所有 Arial Family 字体。希望它对任何人都有帮助。


0
投票

我在迁移服务器时遇到了同样的问题(OpenJDK 1.8、Rocky Linux 9)

无头设置对我没有帮助(

java.awt.headless=true
)。但安装 fontconfig 解决了这个问题。我假设这个包带有默认字体。

$> sudo dnf install fontconfig
$> fc-list
© www.soinside.com 2019 - 2024. All rights reserved.