Temurin-build: 由于缺少字体配置而导致在使用install4j时,sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)上的NPE

创建于 2018-10-29  ·  22评论  ·  资料来源: adoptium/temurin-build

你好呀,
我们的团队在各种Linux发行版的install4j上遇到了NPE问题。 (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

最有用的评论

在CentOS 6和7上安装软件包fontconfig和urw-fonts可以解决此问题。

所有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 

发生这种情况是因为采用OpenJDK应该提供的字体目录不存在

如果我们可以将其从Java 11移植到8u项目,那就太好了。

大声思考-这似乎是一个问题,我们需要上游才能从Java 11或其他向8u项目添加补丁的人支持这种支持。

让我们来看看可能也是安装程序问题。

@karianna感谢您的评论。

是否有一个估计的时间表可以解决该问题,例如短期(几周)或长期(几月)?
这些信息将有助于我们为客户计划支持并减少负面影响。

在此阶段可能需要更长的时间。

FontConfiguration中的NullPointerException。 java:1264是由缺少字体配置文件引起的,该文件未包含在Linux版本的AdoptOpenJDK中。 重要的是要注意,导致异常的直接原因是缺少_configuration_文件,而不是缺少实际的字体文件。

初始化AWT字体子系统后,它将按照如下所述的命名方案和优先级在$ JAVA_HOME / lib中寻找字体配置文件: https :

即使JDK不提供任何字体,并且不打算或未配置OS提供的字体,AWT字体子系统也需要进行最低限度的配置以初始化而不会引发异常。 首先,在$ JAVA_HOME / lib中提供带有以下两行的fontconfig.properties文件,至少可以减轻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感谢您的解决方案。 我可以缓解FontConfiguration中的NullPointerException问题。 在Alphine Linux上的Java:1264

目前面临

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

在CentOS 6和7上安装软件包fontconfig和urw-fonts可以解决此问题。

@ keertz04,您好:调试到源代码时,我遇到了同样的事情。 通过提供fontconfig.properties,它可以在FontConfiguration上摆脱NPE,但是由于系统字体仍然不可用,因此它显示了您所显示的另一个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)

在安装fontconfig并添加fontconfig.properties之后, @ keertz04对我
所以不固定,在高山上。

使用adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
我只需要跑步:
apk add --no-cache fontconfig ttf-dejavu

在Ubuntu 16.04服务器上安装fontconfig对我来说解决了这个问题。 幸运的是,无需添加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-fonts。
安装替代软件包urw-base35-fonts可以解决此问题。

在Red Hat 7.7上,我们首先尝试了创建fontconfig.properties的过程。
我们安装了fontconfig,但没有安装urw-fonts。
安装替代软件包urw-base35-fonts可以解决此问题。

你好,

对我来说,安装缺失的fontconfig并引入$ JAVA_HOME / lib中前面提到的fontconfig.properties就足够了。

我的环境:
OpenJDK运行时环境采用OpenJDK(内部版本14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

@jarnbjo感谢您的解决方案。 我可以缓解FontConfiguration中的NullPointerException问题。 在Alphine Linux上的Java:1264

目前面临

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 等级

相关问题

PierreZ picture PierreZ  ·  5评论

gdams picture gdams  ·  4评论

agilob picture agilob  ·  6评论

karianna picture karianna  ·  7评论

lumpfish picture lumpfish  ·  7评论