2

次のコードは、デスクトップで問題なく動作します。

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setFont(new Font("SansSerif", Font.BOLD, 18));

        Graphics2D graphics = (Graphics2D) g;
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        graphics.drawString(s, 5, 20);

ただし、このコードをサーバー (Docker コンテナー内の Linux alpine で実行されている openjdk) で実行すると、次のエラーで失敗します。

java.lang.UnsatisfiedLinkError: no fontmanager in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:61)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32)
at sun.font.SunFontManager$1.run(SunFontManager.java:339)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<clinit>(SunFontManager.java:335)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
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.access$000(Font.java:224)
at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)
at sun.font.FontUtilities.getFont2D(FontUtilities.java:180)
at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:669)
at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
at sun.java2d.pipe.ValidatePipe.drawString(ValidatePipe.java:165)
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)

java -version (私のサーバー上)は次のようになります:

openjdk version "1.8.0_77-internal"
OpenJDK Runtime Environment (build 1.8.0_77-internal-alpine-r0-b03)
OpenJDK 64-Bit Server VM (build 25.77-b03, mixed mode)

awt libs を検索したところ、次の場所で見つけることができました。

/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libawt_headless.so
/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libawt.so
4

2 に答える 2

7

Alpine Linux 3.4 を実行しているときに、まったく同じ問題に遭遇しました。この github issueの指示に従って問題を解決しました。

  1. GUI サポートを使用して JRE をインストールしますopenjdk8-jreopenjdk8-jre-head
  2. fontconfigおよびttf-dejavuパッケージをインストールします。

Dockerfile の RUN 行は次のようになります。

RUN apk add openjdk8-jre fontconfig ttf-dejavu

この後、JDK はデフォルトのフォントを自動的にロードできるようになり、例外はなくなりました。

于 2016-10-04T20:40:10.707 に答える
2

GUIライブラリがインストールされていないJava 11アプリベースを使用したdockerイメージで同じ問題に遭遇しました。no font manager のようなエラーが発生しましたが、そのエラーの原因は -> awt ライブラリを使用したフォントの読み取り/作成に失敗しています。

GUI をサポートする Java ストレッチ イメージを使用すると、エラーが解消されました。

于 2021-02-10T12:37:00.697 に答える