Temurin-build: NPE в sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) при использовании install4j из-за отсутствия конфигурации шрифта

Созданный на 29 окт. 2018  ·  22Комментарии  ·  Источник: adoptium/temurin-build

Всем привет,
Наша команда столкнулась с проблемой NPE на install4j в различных дистрибутивах Linux. (Ubuntu, Centos, Debian и т. Д.)
Версия JDK: jdk8u181-b13

При установке нашего продукта с помощью installer4j мы получили исключение нулевого указателя, вызванное отсутствием fontconfig, трассировки стека следующим образом:

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)

В настоящее время мы используем обходной путь для установки зависимости шрифта от
apt install fontconfig

Однако этот обходной путь изменит поведение, когда наш клиент перейдет с Oracle jdk на AdoptOpenJDK, и останется для нас проблемой совместимости.

Будет ли команда рассматривать возможность объединения конфигурации шрифта в JDK и помощи в исправлении ее в следующих версиях?

Ваше здоровье,

Распространение: jdk8u181-b13 Linux x64

bug x-linux

Самый полезный комментарий

Установка пакетов fontconfig и urw-fonts в CentOS 6 и 7 устранила проблему.

Все 22 Комментарий

Подумайте вслух - это похоже на проблему, когда нам нужно будет получить апстрим для резервного копирования этой поддержки из Java 11 или кого-то, чтобы добавить патч в проект 8u.

Может быть, проблема с установщиком, посмотрим.

@karianna Программа установки загружает JEditorPane.setText() и проходит через этот путь кода

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 

Это происходит из-за того, что каталог шрифтов, который должен предоставить Adopt OpenJDK, не существует.

Замечательно, если мы сможем перенести это из проекта Java 11 в проект 8u.

Подумайте вслух - это похоже на проблему, когда нам нужно будет получить апстрим для резервного копирования этой поддержки из Java 11 или кого-то, чтобы добавить патч в проект 8u.

Может быть, проблема с установщиком, посмотрим.

Привет, @karianna, спасибо за комментарии.

Будет ли предполагаемый график решения этой проблемы, скажем, в краткосрочной (недели) или более долгосрочной (месяцы) перспективе?
Эта информация будет полезна для планирования поддержки наших клиентов и уменьшения негативного воздействия.

Вероятно, более длительный срок на данном этапе.

Исключение NullPointerException в FontConfiguration. java: 1264 вызвана отсутствием файла конфигурации шрифта, который не включен в версию AdoptOpenJDK для Linux. Важно отметить, что непосредственной причиной исключения является отсутствие файла _configuration_, а не отсутствие фактических файлов шрифтов.

Когда подсистема шрифтов AWT инициализирована, она будет искать файл конфигурации шрифта в $ JAVA_HOME / lib в соответствии со схемой именования и приоритетом, как описано здесь: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

Даже если шрифты не предоставляются JDK и использование шрифтов, предоставляемых ОС, не предусмотрено или не настроено, подсистеме шрифтов AWT требуется минимальная конфигурация для инициализации без создания исключений. Предоставление файла fontconfig.properties в $ JAVA_HOME / lib со следующими двумя строками, по крайней мере, для начала, смягчит проблему с исключением NullPointerException:

version=1
sequence.allfonts=default

Поскольку _we_ использует только шрифты, входящие в комплект нашего приложения, это возможный обходной путь в нашей ситуации. Это позволяет инициализировать подсистему шрифтов, и позже мы можем без проблем загружать наши собственные шрифты из пути к классам. Я не уверен, что произойдет и YMMV, если вы попытаетесь запустить приложение, которое полагается на JDK для предоставления фактических шрифтов, либо в комплекте с JDK, либо в соответствии с операционной системой.

Та же проблема с fontconfig 2: 2.13.1 (в Arch Linux). Я попытался загрузить библиотеку fontconfig вручную и увидел следующую ошибку:

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

Это означает, что включенный jre/lib/amd64/libfreetype.so.6 несовместим с системным fontconfig. Я удалил jre/lib/amd64/libfreetype.so.6 и проблема решена.

@jarnbjo Спасибо за ваше решение. Мне удалось смягчить проблему с исключением NullPointerException в FontConfiguration. java: 1264 в alphine Linux

В настоящее время сталкивается

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)

Любая помощь приветствуется !!
Распространение: jdk8u202-b08 Linux x64

Установка пакетов fontconfig и urw-fonts в CentOS 6 и 7 устранила проблему.

Привет @ keertz04 Я испытал то же самое при отладке исходного кода. Предоставляя fontconfig.properties, он может избавиться от NPE в FontConfiguration, но он обнаружил другой NPE, как вы показали, потому что системные шрифты все еще недоступны, и он выдает исключения, когда пытается получить шрифт платформы по умолчанию.
В настоящее время мы все еще используем обходной путь для установки fontconfig

Просто к сведению тех, кто использует install4j, последняя версия 7.0.9 включает изменения
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

Наша команда не обновлялась до этой версии, думаю, здесь стоит предупредить вас.

+1 для обходного пути fontconfig, и не нужно было использовать fontconfig.properties. (jdk8u202-b08)

@ xinyi9 хороший улов с примечанием к выпуску install4j. К сожалению, я просто попытался создать установщик с помощью install4j 7.0.9 и все еще вижу проблему:
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)

Это на x86_64 Clearlinux 4.14.21-380.lts, используя jdk8u192-b12

В настоящее время сталкивается

``
Вызвано: java.lang.NullPointerException: null
hub_1 | в sun.awt.FcFontManager.getDefaultPlatformFont (FcFontManager.java:76)
hub_1 | в sun.font.SunFontManager $ 2.run (SunFontManager.java:433)

@ keertz04 для меня то же самое, после установки fontconfig и добавления fontconfig.properties.
Так что не фиксированный, на альпийском.

Использование adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Мне просто пришлось бежать:
apk add --no-cache fontconfig ttf-dejavu

Установка fontconfig на сервер Ubuntu 16.04 устранила проблему для меня. К счастью, не нужно добавлять fontconfig.properties (упрощает обновление 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.

Похоже, fonts-dejavu-core тоже важны. Без него возникает другое исключение.

Использование JRE 11 (да, загрузка JRE, а не 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)

заменить изображение на java: 8 , отлично!

В Red Hat 7.7 мы сначала без особого удовольствия попробовали создать fontconfig.properties.
У нас был установлен fontconfig, но не urw-шрифты.
Установка заменяющего пакета urw-base35-fonts устранила проблему.

В Red Hat 7.7 мы сначала без особого удовольствия попробовали создать fontconfig.properties.
У нас был установлен fontconfig, но не urw-шрифты.
Установка заменяющего пакета urw-base35-fonts устранила проблему.

Привет,

для меня было достаточно установить отсутствующий fontconfig и ввести fontconfig.properties, упомянутые ранее в $ JAVA_HOME / lib.

Мой env:
Среда выполнения OpenJDK AdoptOpenJDK (сборка 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo Спасибо за ваше решение. Мне удалось смягчить проблему с исключением NullPointerException в FontConfiguration. java: 1264 в alphine Linux

В настоящее время сталкивается

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)

Любая помощь приветствуется !!
Распространение: jdk8u202-b08 Linux x64

привет, я целыми днями мучился с этим, пока не увидел эту ветку на github и не сделал ночь счастливой

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

Смотрите, что в версии для Linux нет шрифтов AdoptOpenJDK / openjdk-support # 70

Использование adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
Мне просто пришлось бежать:
apk add --no-cache fontconfig ttf-dejavu

Это также решает проблему, если ваш контейнер Docker построен поверх openjdk: 8-jre-alpine.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги