Temurin-build: NPE unter sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) bei Verwendung von install4j, da die Schriftartkonfiguration fehlt

Erstellt am 29. Okt. 2018  ·  22Kommentare  ·  Quelle: adoptium/temurin-build

Hallo,
Unser Team hat bei install4j auf verschiedenen Linux-Distributionen ein NPE-Problem festgestellt. (Ubuntu, Centos, Debian usw.)
JDK-Version: jdk8u181-b13

Bei der Installation unseres Produkts mit installer4j wurde eine Nullzeigerausnahme angezeigt, die durch das Fehlen von fontconfig und Stack Trace wie folgt verursacht wurde:

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 sun.font.SunFontManager.getInstance(SunFontManager.java:250) at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:264) at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1113) at javax.swing.JComponent.getFontMetrics(JComponent.java:1626) at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318) at javax.swing.text.WrappedPlainView.updateChildren(WrappedPlainView.java:297) at javax.swing.text.WrappedPlainView.insertUpdate(WrappedPlainView.java:463) at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1610) at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1869) at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201) at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748) at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707) at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130) at javax.swing.text.DefaultEditorKit.read(DefaultEditorKit.java:273) at javax.swing.JEditorPane.setText(JEditorPane.java:1416) at javax.swing.JEditorPane.<init>(JEditorPane.java:290) at com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.init(AbstractHeadlessScreenExecutor.java:68) at com.install4j.runtime.installer.frontend.headless.ConsoleScreenExecutor.<init>(ConsoleScreenExecutor.java:24) at com.install4j.runtime.installer.frontend.headless.InstallerConsoleScreenExecutor.<init>(InstallerConsoleScreenExecutor.java:6) at com.install4j.runtime.installer.Installer.getScreenExecutor(Installer.java:88) at com.install4j.runtime.installer.Installer.runInProcess(Installer.java:57) at com.install4j.runtime.installer.Installer.main(Installer.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85) at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:62)

Derzeit verwenden wir eine Problemumgehung, um die Schriftartenabhängigkeit von zu installieren
apt install fontconfig

Diese Problemumgehung ändert jedoch das Verhalten, wenn unser Kunde von Oracle JDK zu AdoptOpenJDK wechselt, und bleibt für uns ein Kompatibilitätsproblem.

Würde das Team in Betracht ziehen, die Schriftartkonfiguration im JDK zu bündeln und sie in weiteren Versionen zu beheben?

Prost,

Distribution: jdk8u181-b13 Linux x64

bug x-linux

Hilfreichster Kommentar

Durch die Installation der Pakete fontconfig und urw-fonts unter CentOS 6 und 7 wurde das Problem behoben.

Alle 22 Kommentare

Lautes Nachdenken - dies scheint ein Problem zu sein, bei dem wir Upstream benötigen, um diese Unterstützung von Java 11 zurück zu portieren, oder jemanden, der dem 8u-Projekt einen Patch hinzufügt.

Könnte auch ein Installationsproblem sein, mal sehen.

@karianna Das Installationsprogramm JEditorPane.setText() und das geht durch diesen Codepfad

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 

Dies liegt daran, dass das von Adopt OpenJDK bereitgestellte Schriftartenverzeichnis nicht vorhanden ist

Es ist großartig, wenn wir das von Java 11 auf 8u zurückportieren können.

Lautes Nachdenken - dies scheint ein Problem zu sein, bei dem wir Upstream benötigen, um diese Unterstützung von Java 11 zurück zu portieren, oder jemanden, der dem 8u-Projekt einen Patch hinzufügt.

Könnte auch ein Installationsproblem sein, mal sehen.

Hey @karianna danke für die Kommentare.

Gibt es einen geschätzten Zeitplan, in dem dieses Problem behoben wird, beispielsweise kurzfristig (Wochen) oder längerfristig (Monate)?
Diese Informationen sind hilfreich, um den Support für unsere Kunden zu planen und negative Auswirkungen zu verringern.

Wahrscheinlich längerfristig in dieser Phase.

Die NullPointerException in FontConfiguration. java: 1264 wird durch eine fehlende Schriftartkonfigurationsdatei verursacht, die in der Linux-Version von AdoptOpenJDK nicht enthalten ist. Es ist wichtig zu beachten, dass die direkte Ursache der Ausnahme eine fehlende Konfigurationsdatei ist und nicht, dass tatsächliche Schriftdateien fehlen.

Wenn das AWT-Schriftsubsystem initialisiert wird, sucht es nach einer Schriftkonfigurationsdatei in $ JAVA_HOME / lib nach einem Namensschema und einer Priorität, wie hier beschrieben: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

Selbst wenn vom JDK keine Schriftarten bereitgestellt werden und die Verwendung von vom Betriebssystem bereitgestellten Schriftarten nicht beabsichtigt oder konfiguriert ist, benötigt das AWT-Schriftarten-Subsystem eine minimale Konfiguration, um ohne Ausnahmen zu initialisieren. Wenn Sie eine fontconfig.properties- Datei in $ JAVA_HOME / lib mit den folgenden zwei Zeilen bereitstellen, wird das Problem mit der NullPointerException zumindest zunächst gemindert:

version=1
sequence.allfonts=default

Da _we_ nur Schriftarten verwendet, die mit unserer Anwendung gebündelt sind, ist dies in unserer Situation eine praktikable Problemumgehung. Es ermöglicht die Initialisierung des Schriftarten-Subsystems und wir können später ohne Probleme unsere eigenen Schriftarten aus dem Klassenpfad laden. Ich bin nicht sicher, was passiert und YMMV, wenn Sie versuchen, eine Anwendung auszuführen, die sich auf das JDK stützt, um tatsächliche Schriftarten bereitzustellen, entweder als mit dem JDK gebündelt oder als vom Betriebssystem bereitgestellt.

Gleiches Problem mit fontconfig 2: 2.13.1 (unter Arch Linux). Ich habe versucht, die fontconfig-Bibliothek manuell zu laden, und habe folgenden Fehler festgestellt:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: /usr/lib/libfontconfig.so.1.12.0: /usr/lib/libfontconfig.so.1.12.0: undefined symbol: FT_Done_MM_Var
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    ...

Dies bedeutet, dass das enthaltene jre/lib/amd64/libfreetype.so.6 nicht mit dem System fontconfig kompatibel ist. Ich habe jre/lib/amd64/libfreetype.so.6 und das Problem gelöst.

@jarnbjo Danke für deine Lösung. Ich konnte das Problem mit der NullPointerException in FontConfiguration beheben. Java: 1264 unter alphinem Linux

Derzeit vor

Caused by: java.lang.NullPointerException: null
hub_1           |   at sun.awt.FcFontManager.getDefaultPlatformFont(FcFontManager.java:76)
hub_1           |   at sun.font.SunFontManager$2.run(SunFontManager.java:433)
hub_1           |   at java.security.AccessController.doPrivileged(Native Method)
hub_1           |   at sun.font.SunFontManager.<init>(SunFontManager.java:376)
hub_1           |   at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
hub_1           |   at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
hub_1           |   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
hub_1           |   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
hub_1           |   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
hub_1           |   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
hub_1           |   at java.lang.Class.newInstance(Class.java:442)
hub_1           |   at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
hub_1           |   at java.security.AccessController.doPrivileged(Native Method)
hub_1           |   at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:190)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:224)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:252)
hub_1           |   at sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94)
hub_1           |   at net.sf.jasperreports.engine.util.JRGraphEnvInitializer.initializeGraphEnv(JRGraphEnvInitializer.java:57)

Jede Hilfe wird geschätzt !!
Distribution: jdk8u202-b08 Linux x64

Durch die Installation der Pakete fontconfig und urw-fonts unter CentOS 6 und 7 wurde das Problem behoben.

Hi @ keertz04 Ich habe das gleiche beim Debuggen in den Quellcode erlebt. Durch die Angabe von fontconfig.properties kann die NPE bei FontConfiguration entfernt werden. Es wurde jedoch eine andere NPE aufgedeckt, wie Sie gezeigt haben, da Systemschriftarten immer noch nicht verfügbar sind, und es werden Ausnahmen ausgelöst, wenn versucht wird, die Standardplattformschriftart abzurufen.
Derzeit verwenden wir immer noch die Problemumgehung, um fontconfig zu installieren

Nur zu Ihrer Information für Leute, die install4j verwenden, die neueste Version 7.0.9 enthält die Änderungen
Added a workaround for an InternalError when a bundled JRE could not find fonts on Linux
https://www.ej-technologies.com/download/install4j/changelog.html

Unser Team hat noch kein Upgrade auf diese Version durchgeführt. Wir sind jedoch der Meinung, dass sich hier ein Heads-up lohnt.

+1 für die fontconfig-Problemumgehung und musste nicht fontconfig.properties verwenden. (jdk8u202-b08)

@ xinyi9 guter Fang mit dem install4j Release Note. Leider habe ich gerade versucht, ein Installationsprogramm mit install4j 7.0.9 zu erstellen, und sehe immer noch das Problem:
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 com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85) at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:62)

Dies ist unter x86_64 Clearlinux 4.14.21-380.lts unter Verwendung von jdk8u192-b12 möglich

Derzeit vor

`` `
Auslöser: java.lang.NullPointerException: null
hub_1 | at sun.awt.FcFontManager.getDefaultPlatformFont (FcFontManager.java:76)
hub_1 | at sun.font.SunFontManager $ 2.run (SunFontManager.java:433)

@ keertz04 das gleiche für mich, nachdem ich fontconfig installiert und fontconfig.properties hinzugefügt habe.
Also nicht fixiert, auf alpinen.

Verwenden von adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Ich musste nur rennen:
apk add --no-cache fontconfig ttf-dejavu

Die Installation von fontconfig auf dem Ubuntu 16.04-Server hat das Problem für mich behoben. Zum Glück müssen fontconfig.properties hinzufügen (erleichtert OpenJDK-Upgrades):

$ sudo apt-get install fontconfig
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1
The following NEW packages will be installed:
  fontconfig fontconfig-config fonts-dejavu-core libfontconfig1
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/1398 kB of archives.
After this operation, 4490 kB of additional disk space will be used.

Es sieht so aus, als ob fonts-dejavu-core wichtig ist. Ohne sie tritt eine weitere Ausnahme auf.

Verwenden von JRE 11 (ja, der JRE-Download, nicht JDK):

$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)

Bild durch Java ersetzen

In Red Hat 7.7 haben wir zunächst versucht, fontconfig.properties ohne Freude zu erstellen.
Wir hatten fontconfig installiert, aber keine urw-fonts.
Durch die Installation des Ersatzpakets urw-base35-fonts wurde das Problem behoben.

In Red Hat 7.7 haben wir zunächst versucht, fontconfig.properties ohne Freude zu erstellen.
Wir hatten fontconfig installiert, aber keine urw-fonts.
Durch die Installation des Ersatzpakets urw-base35-fonts wurde das Problem behoben.

Hallo,

Für mich war es genug, fehlende fontconfig zu installieren und fontconfig.properties einzuführen, die zuvor in $ JAVA_HOME / lib erwähnt wurden.

Mein env:
OpenJDK-Laufzeitumgebung AdoptOpenJDK (Build 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo Danke für deine Lösung. Ich konnte das Problem mit der NullPointerException in FontConfiguration beheben. Java: 1264 unter alphinem Linux

Derzeit vor

Caused by: java.lang.NullPointerException: null
hub_1           |     at sun.awt.FcFontManager.getDefaultPlatformFont(FcFontManager.java:76)
hub_1           |     at sun.font.SunFontManager$2.run(SunFontManager.java:433)
hub_1           |     at java.security.AccessController.doPrivileged(Native Method)
hub_1           |     at sun.font.SunFontManager.<init>(SunFontManager.java:376)
hub_1           |     at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
hub_1           |     at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
hub_1           |     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
hub_1           |     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
hub_1           |     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
hub_1           |     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
hub_1           |     at java.lang.Class.newInstance(Class.java:442)
hub_1           |     at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
hub_1           |     at java.security.AccessController.doPrivileged(Native Method)
hub_1           |     at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:190)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:224)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:252)
hub_1           |     at sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94)
hub_1           |     at net.sf.jasperreports.engine.util.JRGraphEnvInitializer.initializeGraphEnv(JRGraphEnvInitializer.java:57)

Jede Hilfe wird geschätzt !!
Distribution: jdk8u202-b08 Linux x64

Hallo, ich habe Tage damit gelitten, bis ich diesen Github-Faden sah und die Nacht glücklich machte

https://github.com/corretto/corretto-11/issues/124#issuecomment -675629775

In der Linux-Version AdoptOpenJDK / openjdk-support # 70 gab es keine Schriftarten

Verwenden von adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Ich musste nur rennen:
apk add --no-cache fontconfig ttf-dejavu

Dies behebt auch das Problem, wenn Ihr Docker-Container auf openjdk: 8-jre-alpine aufgebaut ist

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen