Azure Web 应用程序 (Linux) 开始为 apache poi xlsx 导出抛出字体错误

Azure web app (Linux) started throwing font error for apache poi xlsx export

我有 Java 使用 apache poi 生成 xlsx 导出的应用程序。 该应用程序在 Linux 设置中作为 Web 应用程序部署在 Azure 应用程序服务上,并且几个月以来一直运行良好(Azure Web 服务上从未安装过任何字体配置)。但突然它开始在工作表创建方法上抛出错误,提示未找到字体。

下面是堆栈跟踪

Caused by: java.lang.InternalError: java.lang.reflect.InvocationTargetException
2022-03-04T11:49:12.048900166Z  at java.desktop/sun.font.FontManagerFactory.run(FontManagerFactory.java:86)
2022-03-04T11:49:12.048903666Z  at java.base/java.security.AccessController.doPrivileged(Native Method)
2022-03-04T11:49:12.048907266Z  at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
2022-03-04T11:49:12.048910866Z  at java.desktop/java.awt.Font.getFont2D(Font.java:497)
2022-03-04T11:49:12.048914366Z  at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2250)
2022-03-04T11:49:12.048917866Z  at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469)
2022-03-04T11:49:12.048924066Z  at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530)
2022-03-04T11:49:12.048927967Z  at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273)
2022-03-04T11:49:12.048931467Z  at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
2022-03-04T11:49:12.048935167Z  at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)
2022-03-04T11:49:12.048938867Z  at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:674)
2022-03-04T11:49:12.048942367Z  at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:695)
2022-03-04T11:49:12.048946167Z  at org.xxx.xxx.utils.EXCELReportExporter.writeHeaderLine(EXCELBenchReportExporter.java:28)

深入堆栈跟踪

2022-03-04T11:49:12.049101970Z Caused by: java.lang.reflect.InvocationTargetException: null
2022-03-04T11:49:12.049105470Z  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
2022-03-04T11:49:12.049109070Z  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
2022-03-04T11:49:12.049112670Z  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2022-03-04T11:49:12.049116270Z  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
2022-03-04T11:49:12.049119870Z  at java.desktop/sun.font.FontManagerFactory.run(FontManagerFactory.java:84)
2022-03-04T11:49:12.049123370Z  ... 156 common frames omitted
2022-03-04T11:49:12.049126870Z Caused by: java.lang.NullPointerException: null
2022-03-04T11:49:12.049130370Z  at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
2022-03-04T11:49:12.049133970Z  at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
2022-03-04T11:49:12.049137571Z  at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
2022-03-04T11:49:12.049141071Z  at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
2022-03-04T11:49:12.049144671Z  at java.desktop/sun.font.SunFontManager.run(SunFontManager.java:379)
2022-03-04T11:49:12.049148171Z  at java.base/java.security.AccessController.doPrivileged(Native Method)
2022-03-04T11:49:12.049151671Z  at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:324)
2022-03-04T11:49:12.049155371Z  at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
2022-03-04T11:49:12.049158971Z  at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
2022-03-04T11:49:12.049162671Z  ... 161 common frames omitted

显然应用程序和环境没有任何变化。

相同的应用程序在 Windows 和 Linux 上用 JDK 8 和 11 进行了测试,它在本地仍然运行良好。

非常感谢任何帮助。

我目前遇到了同样的问题。我所做的临时修复是删除所有样式和格式。我认为这是 azure 应用程序服务容器本身的问题。我已经向 Azure 社区提出了这个问题,一旦我得到答案就会在这里更新。

另一种解决方法是将应用程序部署在自定义容器中。

很抱歉您遇到了这个问题。

请检查 Web App 上的 Java 版本是否设置为 auto-update。 这可能会导致 Java 次要版本更改为最新版本,并且可能会在某些 API 调用中引发异常。

this doc 中所述- 建议在生产环境中使用固定版本,而不是 auto-update。

要更新 Java 版本,请尝试以下步骤:

1.Navigate 到 Azure 门户上的 WebApp

2.Select Settings blade 下的 Configuration 选项卡,然后 General Settings.

3.If 您在“Java web 服务器”选项下选择了“Java SE(嵌入式 Web 服务器)(auto-update)”,然后更改 Java minor version11.0.11。现在,检查是否有帮助。

我遇到了同样的问题:Apache POI FontConfiguration NPE on Azure. The only workaround I found for the moment, is to set the minor java version to "11.0.11". I created a GitHub ticket also: https://github.com/Azure/azure-cli/issues/21540。我遇到的问题是我没有找到使用“az webapp create”命令强制使用次要版本的解决方案。

如果您使用的是 Apache Tomcat 8.5,请查看 Azure 门户上配置选项卡中的自动更新。 在最新版本 (> 8.5.66) 中,服务的 Docker 图像还包含 Java 的更新(不是版本而是“提供者”——他们切换到 OpenJDK)并且没有字体安装导致问题。

我修复它回滚到 8.5.66 版本