Temurin-build: NPE em sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) ao usar install4j causado por configuração de fonte ausente

Criado em 29 out. 2018  ·  22Comentários  ·  Fonte: adoptium/temurin-build

Olá,
Nossa equipe encontrou um problema de NPE em install4j em várias distribuições de Linux. (Ubuntu, Centos, Debian etc)
Versão JDK: jdk8u181-b13

Ao instalar nosso produto usando installer4j, obtivemos uma exceção de ponteiro nulo causada por fontconfig ausente, rastreamento de pilha como segue:

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)

Atualmente, usamos uma solução alternativa para instalar a dependência de fonte por
apt install fontconfig

No entanto, essa solução alternativa mudará o comportamento quando nosso cliente mudar do Oracle jdk para AdoptOpenJDK, e continua sendo um problema de compatibilidade para nós.

A equipe consideraria agrupar a configuração da fonte no JDK e ajudar a corrigi-la em outras versões?

Saúde,

Distribuição: jdk8u181-b13 Linux x64

bug x-linux

Comentários muito úteis

Instalar os pacotes fontconfig e urw-fonts no CentOS 6 e 7 corrigiu o problema.

Todos 22 comentários

Pensando em voz alta - parece um problema em que precisaríamos fazer o upstream para fazer o backport desse suporte do Java 11 ou alguém para adicionar um patch ao projeto 8u.

Pode ser um problema do instalador também, vamos ver.

@karianna O instalador inicializa JEditorPane.setText() e passa por este caminho 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 

Isso acontece porque o diretório de fontes que o Adopt OpenJDK deve fornecer não existe

É ótimo se pudermos fazer o backport disso do projeto Java 11 para o 8u.

Pensando em voz alta - parece um problema em que precisaríamos fazer o upstream para fazer o backport desse suporte do Java 11 ou alguém para adicionar um patch ao projeto 8u.

Pode ser um problema do instalador também, vamos ver.

Ei @karianna obrigado pelos comentários.

Haveria um cronograma estimado para que esse problema fosse abordado, digamos em curto prazo (semanas) ou longo prazo (meses)?
Essas informações serão úteis para planejarmos o suporte ao nosso cliente e reduzir o impacto negativo.

Provavelmente a longo prazo nesta fase.

O NullPointerException em FontConfiguration. java: 1264 é causado por um arquivo de configuração de fonte ausente, que não está incluído na versão Linux do AdoptOpenJDK. É importante notar que a causa direta da exceção é um arquivo de _configuração_ ausente e não que os arquivos de fonte reais estão ausentes.

Quando o subsistema de fontes AWT é inicializado, ele procura um arquivo de configuração de fonte em $ JAVA_HOME / lib seguindo um esquema de nomenclatura e prioridade conforme descrito aqui: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

Mesmo se nenhuma fonte for fornecida pelo JDK e o uso de fontes fornecidas pelo sistema operacional não for intencional ou configurado, uma configuração mínima é exigida pelo subsistema de fonte AWT para inicializar sem lançar exceções. Fornecer um arquivo fontconfig.properties em $ JAVA_HOME / lib com as duas linhas a seguir irá, pelo menos, para começar, mitigar o problema com o NullPointerException:

version=1
sequence.allfonts=default

Uma vez que _nós_ estamos usando apenas fontes incluídas em nosso aplicativo, esta é uma solução alternativa viável em nossa situação. Ele permite que o subsistema de fontes seja inicializado e, mais tarde, possamos carregar nossas próprias fontes do caminho de classe sem problemas. Não tenho certeza do que acontece e do YMMV se você tentar executar um aplicativo, que depende do JDK para fornecer fontes reais, seja como fornecido com o JDK ou fornecido pelo sistema operacional.

O mesmo problema com o fontconfig 2: 2.13.1 (no arch linux). Tentei carregar a biblioteca fontconfig manualmente e vi o seguinte erro:

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

Isso significa que jre/lib/amd64/libfreetype.so.6 incluído não é compatível com o fontconfig do sistema. Removi jre/lib/amd64/libfreetype.so.6 e o problema foi resolvido.

@jarnbjo Obrigado pela sua solução. Consegui atenuar o problema com o NullPointerException em FontConfiguration. java: 1264 no alphine Linux

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

Qualquer ajuda é apreciada !!
Distribuição: jdk8u202-b08 Linux x64

Instalar os pacotes fontconfig e urw-fonts no CentOS 6 e 7 corrigiu o problema.

Olá @ keertz04 , experimentei a mesma coisa ao depurar o código-fonte. Ao fornecer fontconfig.properties, ele é capaz de se livrar do NPE em FontConfiguration, mas descobriu outro NPE como você mostrou porque as fontes do sistema ainda não estão disponíveis e lançará exceções quando tentar obter a fonte padrão da plataforma.
Atualmente, ainda usamos a solução alternativa para instalar fontconfig

Para quem usa install4j, a versão mais recente 7.0.9 incluiu as mudanças
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

Nossa equipe não atualizou para esta versão, mas acho que vale a pena dar uma olhada aqui.

1 para a solução alternativa do fontconfig, e não precisa usar o fontconfig.properties. (jdk8u202-b08)

@ xinyi9 boa captura com a nota de lançamento install4j. Infelizmente, eu apenas tentei construir um instalador usando install4j 7.0.9 e ainda vejo o 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)

Isso está em x86_64 Clearlinux 4.14.21-380.lts, usando jdk8u192-b12

Atualmente enfrentando

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

@ keertz04 o mesmo para mim, depois de instalar o fontconfig e adicionar fontconfig.properties.
Portanto, não fixo, em alpino.

Usando adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Eu só tive que correr:
apk add --no-cache fontconfig ttf-dejavu

Instalar fontconfig no servidor Ubuntu 16.04 corrigiu o problema para mim. Não há necessidade de adicionar fontconfig.properties felizmente (torna as atualizações do OpenJDK mais fáceis):

$ 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 é importante. Sem ele, outra exceção ocorre.

Usando JRE 11 (sim, o download do JRE, não 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)

substitua a imagem por java: 8 , perfeito!

No Red Hat 7.7, tentamos primeiro criar fontconfig.properties sem nenhum prazer.
Tínhamos o fontconfig instalado, mas não o urw-fonts.
Instalar o pacote de substituição urw-base35-fonts resolveu o problema.

No Red Hat 7.7, tentamos primeiro criar fontconfig.properties sem nenhum prazer.
Tínhamos o fontconfig instalado, mas não o urw-fonts.
Instalar o pacote de substituição urw-base35-fonts resolveu o problema.

Oi,

para mim foi suficiente instalar o fontconfig ausente e introduzir o fontconfig.properties mencionado anteriormente em $ JAVA_HOME / lib.

Meu env:
OpenJDK Runtime Environment AdoptOpenJDK (compilação 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo Obrigado pela sua solução. Consegui atenuar o problema com o NullPointerException em FontConfiguration. java: 1264 no alphine Linux

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

Qualquer ajuda é apreciada !!
Distribuição: jdk8u202-b08 Linux x64

oi passei dias sofrendo com isso até que vi esse tópico do github e fiz a noite feliz

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

Veja que não havia fontes na versão Linux AdoptOpenJDK / openjdk-support # 70

Usando adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Eu só tive que correr:
apk add --no-cache fontconfig ttf-dejavu

Isso também corrige o problema se o contêiner do Docker for construído sobre openjdk: 8-jre-alpine

Esta página foi útil?
0 / 5 - 0 avaliações