Temurin-build: NPE à sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) lors de l'utilisation de install4j en raison d'une configuration de police manquante

Créé le 29 oct. 2018  ·  22Commentaires  ·  Source: adoptium/temurin-build

Salut,
Notre équipe a rencontré un problème NPE sur install4j sur diverses distributions Linux. (Ubuntu, Centos, Debian, etc.)
Version JDK: jdk8u181-b13

Lors de l'installation de notre produit à l'aide de installer4j, nous avons obtenu une exception de pointeur nul due à l'absence de fontconfig, trace de la pile comme suit:

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)

Actuellement, nous utilisons une solution de contournement pour installer la dépendance de police en
apt install fontconfig

Cependant, cette solution de contournement changera le comportement lorsque notre client passera d'Oracle jdk à AdoptOpenJDK, et reste un problème de compatibilité pour nous.

L'équipe envisagerait-elle de regrouper la configuration des polices dans le JDK et d'aider à la corriger dans d'autres versions?

Acclamations,

Distribution: jdk8u181-b13 Linux x64

bug x-linux

Commentaire le plus utile

L'installation des packages fontconfig et urw-fonts sur CentOS 6 et 7 a résolu le problème.

Tous les 22 commentaires

Penser à voix haute - cela ressemble à un problème où nous aurions besoin de monter en amont pour rétroporter ce support de Java 11 ou de quelqu'un pour ajouter un correctif au projet 8u.

Peut-être aussi un problème d'installation, voyons voir.

@karianna Le programme d'installation JEditorPane.setText() et qui passe par ce chemin de code

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 

Cela se produit parce que le répertoire de polices que Adopt OpenJDK devrait fournir n'existe pas

C'est génial si nous pouvons rétroporter cela du projet Java 11 au projet 8u.

Penser à voix haute - cela ressemble à un problème où nous aurions besoin de monter en amont pour rétroporter ce support de Java 11 ou de quelqu'un pour ajouter un correctif au projet 8u.

Peut-être aussi un problème d'installation, voyons voir.

Hey @karianna merci pour les commentaires.

Y aurait-il un délai estimé pour résoudre ce problème, par exemple à court terme (semaines) ou à plus long terme (mois)?
Ces informations nous seront utiles pour planifier l'assistance pour nos clients et réduire l'impact négatif.

Probablement à plus long terme à ce stade.

NullPointerException dans FontConfiguration. java: 1264 est dû à un fichier de configuration de police manquant, qui n'est pas inclus avec la version Linux d'AdoptOpenJDK. Il est important de noter que la cause directe de l'exception est un fichier _configuration_ manquant et non que les fichiers de polices réels sont manquants.

Lorsque le sous-système de polices AWT est initialisé, il recherchera un fichier de configuration de police dans $ JAVA_HOME / lib en suivant un schéma de dénomination et une priorité comme décrit ici: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

Même si aucune police n'est fournie par le JDK et que l'utilisation des polices fournies par le système d'exploitation n'est pas intentionnelle ou configurée, une configuration minimale est requise par le sous-système de polices AWT pour s'initialiser sans lever d'exceptions. Fournir un fichier fontconfig.properties dans $ JAVA_HOME / lib avec les deux lignes suivantes permettra au moins, pour commencer, d'atténuer le problème avec l'exception NullPointerException:

version=1
sequence.allfonts=default

Étant donné que _nous_ n'utilisons que les polices fournies avec notre application, il s'agit d'une solution de contournement possible dans notre situation. Cela permet au sous-système de polices de s'initialiser et nous pouvons plus tard sans problème charger nos propres polices à partir du chemin de classe. Je ne suis pas sûr de ce qui se passe et de YMMV si vous essayez d'exécuter une application, qui repose sur le JDK pour fournir des polices réelles, soit comme fourni avec le JDK, soit comme fourni par le système d'exploitation.

Même problème avec fontconfig 2: 2.13.1 (sur arch linux). J'ai essayé de charger la bibliothèque fontconfig manuellement et j'ai vu l'erreur suivante:

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)
    ...

Cela signifie que le jre/lib/amd64/libfreetype.so.6 inclus n'est pas compatible avec le système fontconfig. J'ai supprimé jre/lib/amd64/libfreetype.so.6 et le problème est résolu.

@jarnbjo Merci pour votre solution. J'ai pu atténuer le problème avec l'exception NullPointerException dans FontConfiguration. java: 1264 sur alphine Linux

Actuellement confronté

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)

Toute aide est appréciée !!
Distribution: jdk8u202-b08 Linux x64

L'installation des packages fontconfig et urw-fonts sur CentOS 6 et 7 a résolu le problème.

Salut @ keertz04 J'ai vécu la même chose lors du débogage dans le code source. En fournissant fontconfig.properties, il est capable de se débarrasser du NPE à FontConfiguration, mais il a découvert un autre NPE comme vous l'avez montré car les polices système ne sont toujours pas disponibles, et il lèvera des exceptions lorsqu'il essaiera d'obtenir la police de plate-forme par défaut.
Actuellement, nous utilisons toujours la solution de contournement pour installer fontconfig

Juste pour info pour les personnes qui utilisent install4j, la dernière version 7.0.9 a inclus les changements
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

Notre équipe n'a pas mis à niveau vers cette version, je pense que cela pourrait valoir la peine d'être averti ici.

+1 pour la solution de contournement fontconfig, et n'a pas besoin d'utiliser fontconfig.properties. (jdk8u202-b08)

@ xinyi9 bonne prise avec la note de publication install4j. Malheureusement, j'ai juste essayé de créer un programme d'installation en utilisant install4j 7.0.9 et je vois toujours le problème:
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)

Ceci est sur x86_64 Clearlinux 4.14.21-380.lts, en utilisant jdk8u192-b12

Actuellement confronté

''
Causé par: java.lang.NullPointerException: null
hub_1 | à sun.awt.FcFontManager.getDefaultPlatformFont (FcFontManager.java:76)
hub_1 | à sun.font.SunFontManager $ 2.run (SunFontManager.java:433)

@ keertz04 pareil pour moi, après avoir installé fontconfig et ajouté fontconfig.properties.
Donc pas fixe, sur alpin.

Utilisation de adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Je devais juste courir:
apk add --no-cache fontconfig ttf-dejavu

L'installation de fontconfig sur le serveur Ubuntu 16.04 a résolu le problème pour moi. Pas besoin d'ajouter fontconfig.properties heureusement (facilite les mises à jour d'OpenJDK):

$ 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.

On dirait que fonts-dejavu-core est également important. Sans cela, une autre exception se produit.

En utilisant JRE 11 (oui, le téléchargement JRE, pas 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)

remplacez l'image par java: 8 , parfait!

Sur Red Hat 7.7, nous avons d'abord essayé la création de fontconfig.properties sans aucune joie.
Nous avions installé fontconfig, mais pas urw-fonts.
L'installation du package de remplacement urw-base35-fonts a résolu le problème.

Sur Red Hat 7.7, nous avons d'abord essayé la création de fontconfig.properties sans aucune joie.
Nous avions installé fontconfig, mais pas urw-fonts.
L'installation du package de remplacement urw-base35-fonts a résolu le problème.

Salut,

pour moi, il suffisait d'installer fontconfig manquant et d'introduire fontconfig.properties mentionné précédemment dans $ JAVA_HOME / lib.

Mon env:
Environnement d'exécution OpenJDK AdoptOpenJDK (build 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo Merci pour votre solution. J'ai pu atténuer le problème avec l'exception NullPointerException dans FontConfiguration. java: 1264 sur alphine Linux

Actuellement confronté

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)

Toute aide est appréciée !!
Distribution: jdk8u202-b08 Linux x64

salut, j'ai passé des jours à en souffrir jusqu'à ce que je voie ce fil de github et rende la nuit heureuse

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

Voir qu'il n'y avait pas de polices dans la version Linux AdoptOpenJDK / openjdk-support # 70

Utilisation de adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Je devais juste courir:
apk add --no-cache fontconfig ttf-dejavu

Cela résout également le problème si votre conteneur Docker est construit sur openjdk: 8-jre-alpine

Cette page vous a été utile?
0 / 5 - 0 notes