Temurin-build: NPE en sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) cuando se usa install4j debido a que falta la configuración de la fuente

Creado en 29 oct. 2018  ·  22Comentarios  ·  Fuente: adoptium/temurin-build

Hola,
Nuestro equipo encontró un problema de NPE en install4j en varias distribuciones de Linux. (Ubuntu, Centos, Debian, etc.)
Versión JDK: jdk8u181-b13

Al instalar nuestro producto usando installer4j, obtuvimos una excepción de puntero nulo causada por la falta de fontconfig, seguimiento de pila de la siguiente manera:

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)

Actualmente utilizamos una solución alternativa para instalar la dependencia de fuentes mediante
apt install fontconfig

Sin embargo, esta solución cambiará el comportamiento cuando nuestro cliente cambie de Oracle jdk a AdoptOpenJDK, y seguirá siendo un problema de compatibilidad para nosotros.

¿Consideraría el equipo incluir la configuración de fuentes en el JDK y ayudar a solucionarlo en versiones posteriores?

Salud,

Distribución: jdk8u181-b13 Linux x64

bug x-linux

Comentario más útil

La instalación de los paquetes fontconfig y urw-fonts en CentOS 6 y 7 solucionó el problema.

Todos 22 comentarios

Pensando en voz alta: esto parece un problema en el que tendríamos que subir para respaldar este soporte de Java 11 o alguien para agregar un parche al proyecto 8u.

También podría ser un problema del instalador, veamos.

@karianna El instalador JEditorPane.setText() y pasa por esta ruta de código

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 

Eso sucede porque el directorio de fuentes que debería proporcionar Adopt OpenJDK no existe

Sería genial si pudiéramos exportarlo desde el proyecto Java 11 al 8u.

Pensando en voz alta: esto parece un problema en el que tendríamos que subir para respaldar este soporte de Java 11 o alguien para agregar un parche al proyecto 8u.

También podría ser un problema del instalador, veamos.

Hola @karianna gracias por los comentarios.

¿Habría un cronograma estimado en el que se abordará este problema, por ejemplo, a corto plazo (semanas) o a más largo plazo (meses)?
Esta información nos será útil para planificar el soporte para nuestro cliente y reducir el impacto negativo.

Probablemente a más largo plazo en esta etapa.

La excepción NullPointerException en FontConfiguration. java: 1264 se debe a que falta un archivo de configuración de fuente, que no se incluye con la versión de Linux de AdoptOpenJDK. Es importante notar que la causa directa de la excepción es un archivo _configuration_ faltante y no que falten archivos de fuentes reales.

Cuando se inicializa el subsistema de fuentes AWT, buscará un archivo de configuración de fuentes en $ JAVA_HOME / lib siguiendo un esquema de nomenclatura y prioridad como se describe aquí: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

Incluso si el JDK no proporciona fuentes y el uso de fuentes proporcionadas por el sistema operativo no está previsto ni configurado, el subsistema de fuentes AWT requiere una configuración mínima para inicializar sin generar excepciones. Proporcionar un archivo fontconfig.properties en $ JAVA_HOME / lib con las siguientes dos líneas al menos, para empezar, mitigará el problema con la NullPointerException:

version=1
sequence.allfonts=default

Dado que _solo_ usamos fuentes incluidas con nuestra aplicación, esta es una solución viable en nuestra situación. Permite que el subsistema de fuentes se inicialice y luego, sin problemas, podemos cargar nuestras propias fuentes desde la ruta de clases. No estoy seguro de qué sucede y YMMV si intenta ejecutar una aplicación, que se basa en el JDK para proporcionar fuentes reales, ya sea como se incluye con el JDK o como lo proporciona el sistema operativo.

El mismo problema con fontconfig 2: 2.13.1 (en arch linux). Intenté cargar la biblioteca fontconfig manualmente y vi el siguiente error:

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

Significa que el jre/lib/amd64/libfreetype.so.6 incluido no es compatible con el sistema fontconfig. Eliminé jre/lib/amd64/libfreetype.so.6 y el problema se resolvió.

@jarnbjo Gracias por tu solución. Pude mitigar el problema con NullPointerException en FontConfiguration. java: 1264 en alphine Linux

Actualmente enfrentando

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)

¡Se agradece cualquier ayuda!
Distribución: jdk8u202-b08 Linux x64

La instalación de los paquetes fontconfig y urw-fonts en CentOS 6 y 7 solucionó el problema.

Hola @ keertz04 Experimenté lo mismo al depurar en el código fuente. Al proporcionar fontconfig.properties, puede deshacerse de la NPE en FontConfiguration, pero descubrió otra NPE como mostró porque las fuentes del sistema aún no están disponibles y arrojará excepciones cuando intente obtener la fuente de plataforma predeterminada.
Actualmente, todavía usamos la solución alternativa para instalar fontconfig

Solo para las personas que usan install4j, la última versión 7.0.9 ha incluido los cambios
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

Nuestro equipo no se ha actualizado a esta versión, aunque creo que podría valer la pena avisar aquí.

+1 para la solución alternativa de fontconfig, y no es necesario utilizar fontconfig.properties. (jdk8u202-b08)

@ xinyi9 buena captura con la nota de lanzamiento de install4j. Desafortunadamente, solo intenté crear un instalador usando install4j 7.0.9 y todavía veo el problema:
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)

Esto está en x86_64 Clearlinux 4.14.21-380.lts, usando jdk8u192-b12

Actualmente enfrentando

''
Causado por: java.lang.NullPointerException: null
hub_1 | en sun.awt.FcFontManager.getDefaultPlatformFont (FcFontManager.java:76)
hub_1 | en sun.font.SunFontManager $ 2.run (SunFontManager.java:433)

@ keertz04 lo mismo para mí, después de instalar fontconfig y agregar fontconfig.properties.
Así que no fijo, en alpino.

Usando adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Solo tenía que correr:
apk add --no-cache fontconfig ttf-dejavu

La instalación de fontconfig en el servidor Ubuntu 16.04 solucionó el problema. No es necesario agregar fontconfig.properties afortunadamente (facilita las actualizaciones de 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.

Parece que fonts-dejavu-core es importante. Sin él, se produce otra excepción.

Usando JRE 11 (sí, la descarga de JRE, no 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)

reemplace la imagen con java: 8 , ¡perfecto!

En Red Hat 7.7, primero probamos la creación de fontconfig.properties sin ningún placer.
Teníamos instalado fontconfig, pero no urw-fonts.
La instalación del paquete sustituto urw-base35-fonts resolvió el problema.

En Red Hat 7.7, primero probamos la creación de fontconfig.properties sin ningún placer.
Teníamos instalado fontconfig, pero no urw-fonts.
La instalación del paquete sustituto urw-base35-fonts resolvió el problema.

Hola,

para mí fue suficiente instalar fontconfig faltante e introducir fontconfig.properties mencionado anteriormente en $ JAVA_HOME / lib.

Mi env:
Entorno de ejecución OpenJDK AdoptOpenJDK (compilación 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo Gracias por tu solución. Pude mitigar el problema con NullPointerException en FontConfiguration. java: 1264 en alphine Linux

Actualmente enfrentando

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)

¡Se agradece cualquier ayuda!
Distribución: jdk8u202-b08 Linux x64

hola, pasé días sufriendo con eso hasta que vi este hilo de github e hice feliz la noche

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

Vea que no había fuentes en la versión de Linux AdoptOpenJDK / openjdk-support # 70

Usando adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Solo tenía que correr:
apk add --no-cache fontconfig ttf-dejavu

Esto también soluciona el problema si su contenedor Docker está construido sobre openjdk: 8-jre-alpine

¿Fue útil esta página
0 / 5 - 0 calificaciones