在 Linux (Servicemix) 下运行时在工作表上调用 autoSizeColumn 时崩溃
Posted
技术标签:
【中文标题】在 Linux (Servicemix) 下运行时在工作表上调用 autoSizeColumn 时崩溃【英文标题】:Crash when calling autoSizeColumn on worksheet, when run under Linux (Servicemix) 【发布时间】:2011-11-16 18:25:39 【问题描述】:我编写了生成 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 调用时结束。
有没有人遇到过这种行为并知道它是如何引起的以及如何解决的?
【问题讨论】:
【参考方案1】:为了能够计算列宽,POI 需要获取正在使用的 Font,并要求它依次调整每个字符的大小。在我所知道的所有 JVM 上,这都需要图形环境,因为实际工作由 JVM 委托给底层图形系统。
如果您使用的是 Windows,则始终拥有图形系统,这很好。在 Linux 上,如果您在服务器上的命令行上运行,则可能不会。 (不过,Linux 作为桌面也不错)
如果您在没有运行 X 服务器的 linux 服务器上运行,您需要告诉 Java 运行“无头”。取自POI AutoSize documentation
计算列宽 Sheet.autoSizeColumn 使用 Java2D 类,如果图形环境不可用,则会引发异常。如果图形环境不可用,您必须告诉 Java 您正在以无头模式运行并设置以下系统属性: java.awt.headless=true
尝试设置当您启动 JVM 时,我有预感它会解决您的问题(这很可能是由于 Java 没有找到完整的图形环境造成的)
【讨论】:
【参考方案2】:您好,我遇到了类似的问题。我没有任何崩溃,但在我的开发环境(Windows)上,autosizecolumn 有效。在生产环境(类Unix)上它不起作用。我把系统属性 java.awt.headless=true 但我仍然有问题。我解决了this solution 之后的问题,但我添加了所有 Arial Family 字体。希望它可以帮助任何人。
【讨论】:
以上是关于在 Linux (Servicemix) 下运行时在工作表上调用 autoSizeColumn 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章