java - 如何将一些默认字体安装到在 Docker 中运行的 Openjdk 8

标签 java docker

我有一个基于 Java 的 Docker 文件应用程序 - https://hub.docker.com/r/songkong/songkong/~/dockerfile/

一个问题是 DockerFile 似乎没有安装任何字体,这导致我的应用程序出现此错误

java.lang.NullPointerException
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
    at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
    at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
    at sun.font.SunFontManager$2.run(SunFontManager.java:431)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.SunFontManager.<init>(SunFontManager.java:376)
    at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
    at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
    at java.awt.Font.getFont2D(Font.java:491)
    at java.awt.Font.canDisplayUpTo(Font.java:2060)
    at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
    at java.awt.font.TextLayout.<init>(TextLayout.java:531)
    at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
    at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
    at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:79)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:656)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:677)
    at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:83)
    at com.jthink.songkong.reports.spreadsheet.Worksheet.<init>(Worksheet.java:23)
    at com.jthink.songkong.reports.spreadsheet.BasicWorksheet.<init>(BasicWorksheet.java:15)
    at com.jthink.songkong.reports.spreadsheet.SpreadsheetReport.<init>(SpreadsheetReport.java:51)
    at com.jthink.songkong.reports.fixsongsreport.SpreadsheetReportSection.outputReport(SpreadsheetReportSection.java:82)
    at com.jthink.songkong.reports.FixSongsReport.outputSpreadsheet(FixSongsReport.java:1033)
    at com.jthink.songkong.reports.FixSongsReportCreator.createReport(FixSongsReportCreator.java:122)
    at com.jthink.songkong.analyse.toplevelanalyzer.FixSongsController.start(FixSongsController.java:329)
    at com.jthink.songkong.server.callback.ServerFixSongs$Task.run(ServerFixSongs.java:448)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我之前在(非 Docker)linux 安装上遇到过这个问题,我通过在我的应用程序下载中添加一些字体然后使用来绕过它

fc-cache -rv /opt/songkong/fonts

安装字体

所以我把字体添加到应用程序下载然后添加

CMD fc-cache -rv /opt/songkong/fonts;

到我的 DockerFile 但它没有工作

可能这不是正确的方法,有没有正确的方法。

最佳答案

答案来自 https://unix.stackexchange.com/questions/438257/how-to-install-microsoft-true-type-font-on-alpine-linux

我发现 fp-cache 作为 openjdk:8-jre-alpine 发行版的一部分不存在

但添加:

RUN apk --no-cache add msttcorefonts-installer fontconfig && \
    update-ms-fonts && \
    fc-cache -f

我的 Dockerfile 不仅添加了 fc-cache,还安装了一组默认字体。

这就是解决 Java 问题所需的全部(我还可以删除 fc-cache -rv/opt/songkong/fonts 行)并允许我使用 jakarta 创建 Excel 电子表格-poi库。

关于java - 如何将一些默认字体安装到在 Docker 中运行的 Openjdk 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597838/

相关文章:

java - 在/*上映射全局前端 Controller servlet时如何访问静态资源

java - Guava :如何从列表和单个元素创建显式排序?

Java - 对于通用数据类型 Stack<Item>,new Stack<?>[N] 是否等同于 new Stack[N]?

docker - 在 kubernetes 中的 asp.net 核心容器中登录重置/丢失

docker - Web API端点可与docker-compose.yml一起使用,但不适用于仅使用Dockerfile进行构建和运行的情况

docker - 动态部署对 Docker 及其容器的更改

java - 如果存在符合给定条件的行,如何从 Java 检查数据库?

java - 如何使用JfreeChart设置Y轴的范围?

postgresql - 无法从 Docker 容器连接到主机上的 PostgreSQL

linux - Docker 容器上的 ImageMagick 生成格式错误的 PNG 图像