[OpenJDK 2D-Dev] "java.lang.Error: Probable fatal error:No fonts found" does notshow on 11

Philip Race philip.race at oracle.com
Mon Mar 4 15:47:49 UTC 2019


This is getting into "why doesn't my app run if I remove
things it needs to run ?" territory.

A headless environment does not mean that fonts aren't needed.
Headless environments are used to do text rendering.

So whilst we could have a discussion about what form the error
should take, at some point you should get an error.
Silently returning from all text rendering related API calls without
failing would be even worse.

If you don't want to do anything with rendering, why is any kind
of toolkit (headless or otherwise) being loaded ?

The native fontconfig library isn't a runtime linker dependency only
because we started using it before it could be guaranteed available
for all the distro versions we support.

If we were doing this today we'd almost certainly link at compile time
and then if you did not install it your binary would not even start - 
even in
headless mode.

I say this not because it would somehow improve your situation, but
to make clear that libfontconfig is not an optional library.

So on Linux fonts need to be provided by at least one of :
-  the system + located using libfontconfig
- in the JRE lib/fonts folder
- in one of several  unspecified system locations that are still 
searched by the code
    that pre-dates libfontconfig

The 2nd + 3rd of these should be considered legacy.
The 2nd applied to Oracle JDK when we shipped fonts, but adding your own
fonts there is no longer supported by Oracle JDK or OpenJDK.

The only scenario I can think of that might get by is where the app
is supplying fonts using Font.createFont() and *only* those are used / 
needed
I suspect that is a rare case and would help only a very specific 
controlled application
where you knew you used those fonts and no other fonts.


-phil.

On 3/3/19, 4:54 PM, Bernd Eckenfels wrote:
>
> Hello,
>
> the number of variations of this exception keeps increasing. When I 
> use the RHEL8 beta with ist java-1.8.0-openjdk-headless.x86_64 (which 
> has no fontconfig.* files and the libfontconfig is not installed) I get:
>
> [ecki at rhel8 ~]$ java -showversion FontTest
>
> openjdk version "1.8.0_181"
>
> OpenJDK Runtime Environment (build 1.8.0_181-b13)
>
> OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
>
> Are we headless? true
>
> g = sun.java2d.HeadlessGraphicsEnvironment headless: true
>
> Exception in thread "main" 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.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:190)
>
>         at 
> sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:224)
>
>         at 
> sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:97)
>
>         at FontTest.main(FontTest.java:15)
>
> [ecki at rhel8 ~]$ ls 
> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181.b13-9.el8.x86_64/jre/lib/*font*
>
> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181.b13-9.el8.x86_64/jre/lib/psfontj2d.properties  
> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181.b13-9.el8.x86_64/jre/lib/psfont.properties.ja
>
> -- 
> http://bernd.eckenfels.net
>
> *Von: *Bernd Eckenfels <mailto:ecki at zusammenkunft.net>
> *Gesendet: *Donnerstag, 28. Februar 2019 09:56
> *An: *2d-dev <mailto:2d-dev at openjdk.java.net>
> *Cc: *Java Core Libs <mailto:core-libs-dev at openjdk.java.net>
> *Betreff: *Re: "java.lang.Error: Probable fatal error:No fonts found" 
> does notshow on 11
>
> Hello,
>
> I can confirm the same ugly error stack with 12-b33 EA, this time with 
> debug:
>
> $ jdk-12/bin/java -cp . -Dsun.java2d.debugfonts=true FontTest
>
> Are we headless? true
>
> g = sun.java2d.HeadlessGraphicsEnvironment headless: true
>
> Feb 28, 2019 9:50:32 AM sun.awt.X11FontManager registerFontDir
>
> INFO: ParseFontDir /home/vagrant/jdk-12/lib/fonts
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration <init>
>
> INFO: Creating standard Font Configuration
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.3.1611.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.3.1611.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.3.1611.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.3.1611.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findFontConfigFile
>
> INFO: Did not find a fontconfig file.
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration <init>
>
> INFO: Creating standard Font Configuration
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.3.1611.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.3.1611.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.7.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.RedHat.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.3.1611.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.3.1611.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.7.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for text fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.properties
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findImpl
>
> INFO: Looking for binary fontconfig file : 
> /home/vagrant/jdk-12/lib/fontconfig.bfc
>
> Feb 28, 2019 9:50:32 AM sun.awt.FontConfiguration findFontConfigFile
>
> INFO: Did not find a fontconfig file.
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for sans:regular:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for sans:bold:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for sans:regular:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for sans:bold:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for serif:regular:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for serif:bold:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for serif:regular:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for serif:bold:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for monospace:regular:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for monospace:bold:roman
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for monospace:regular:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no font for monospace:bold:italic
>
> Feb 28, 2019 9:50:32 AM sun.font.FontConfigManager initFontConfigFonts
>
> INFO: Fontconfig returned no fonts at all.
>
> Feb 28, 2019 9:50:32 AM sun.font.FcFontConfiguration warning
>
> WARNING: Failed to get info from libfontconfig
>
> Feb 28, 2019 9:50:32 AM sun.font.FcFontConfiguration warning
>
> WARNING: Failed to get info from libfontconfig
>
> Exception in thread "main" java.lang.InternalError: 
> java.lang.reflect.InvocationTargetException
>
>        at 
> java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
>
>        at 
> java.base/java.security.AccessController.doPrivileged(AccessController.java:310)
>
>        at 
> java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
>
>        at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:189)
>
>        at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:223)
>
>        at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:251)
>
>        at 
> java.desktop/sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:75)
>
> Gruss
>
> Bernd
>
> -- 
>
> http://bernd.eckenfels.net
>
> *Von:*Philip Race <philip.race at oracle.com>
> *Gesendet:* Donnerstag, Februar 28, 2019 12:45 AM
> *An:* Bernd Eckenfels; 2d-dev
> *Cc:* awt-dev at openjdk.java.net; Java Core Libs
> *Betreff:* Re: "java.lang.Error: Probable fatal error:No fonts found" 
> does not show on 11
>
> Wrong list. You want 2d-dev.
>
> -phil.
>
> On 2/27/19, 3:26 PM, Bernd Eckenfels wrote:
> > Hello,
> >
> > (please let me know in case I picked the wrong list.)
> >
> > Since OpenJDK does not ship Default *.ttf font files the change that 
> a JRE is installed in a way that no System Fonts can be found is quite 
> high.
> >
> > In OpenJDK8 it is a bit unfortunate that in this situation even for 
> the headless graphics context that you can can a Java.lang.Error:
> >
> > I wonder if this is intentional. How About returnign an empty Array 
> or Maybe a RntimeException instead? In my case by upgrading from 
> Oracle JRE to Open JDK (in my case Azul) a perfectly fine working 
> Installation is not aborting.
> >
> > The JasperReports component used is failing does not even need the 
> System Fonts (which I will report to them seperately). For Zulu it is 
> enough to install Dejavu Fonts in System Directory or copy them to 
> JRE/lib/fonts/, but I have also seen OpenJDK builds which seem to use 
> fontmanager libraries instead of fixed file path. Here I guess the 
> dependency on System config is even higher.
> >
> > I tested on a minimal System with no X11:
> >
> >> ls /usr/share/fonts
> >> cat /etc/centos-release
> > CentOS Linux release 7.3.1611 (Core)
> >
> > And my test program (below) Returns for Java 8:
> >
> >> zulu8*x64/bin/java -cp . FontTest
> > Are we headless? true
> > g = sun.java2d.HeadlessGraphicsEnvironment headless: true
> > Exception in thread "main" java.lang.Error: Probable fatal error:No 
> fonts found.
> > at 
> sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1236)
> > at 
> sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
> > …
> > at 
> sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
> > at 
> sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
> > at 
> sun.font.SunFontManager.initialiseDeferredFonts(SunFontManager.java:927)
> > at sun.font.SunFontManager.loadFonts(SunFontManager.java:3302)
> > at sun.awt.X11FontManager.loadFonts(X11FontManager.java:466)
> > at sun.font.SunFontManager.loadFontFiles(SunFontManager.java:3429)
> > at 
> sun.font.SunFontManager.getInstalledFontFamilyNames(SunFontManager.java:3766) 
>
> > at 
> sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:225) 
>
> > at 
> sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:252) 
>
> > at 
> sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94) 
>
> > at FontTest.main(FontTest.java:15)
> >
> > So the error in itself is one topic I wanted to inquire About. 
> However, even worse in OpenJDK 11 the error seems to have degenerated 
> quite a bit, it Looks for me:
> >
> >> zulu11*x64/bin/java -cp . FontTest
> > Are we headless? true
> > g = sun.java2d.HeadlessGraphicsEnvironment headless: true
> > Exception in thread "main" java.lang.InternalError: 
> java.lang.reflect.InvocationTargetException
> > at 
> java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86) 
>
> > at java.base/java.security.AccessController.doPrivileged(Native Method)
> > at 
> java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) 
>
> > at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:189) 
>
> > at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:223) 
>
> > at 
> java.desktop/sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:251) 
>
> > at 
> java.desktop/sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:75) 
>
> > at FontTest.main(FontTest.java:15)
> > Caused by: java.lang.reflect.InvocationTargetException
> > at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
> Method)
> > at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
>
> > at 
> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
>
> > at 
> java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
> > at 
> java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84) 
>
> > ... 7 more
> > Caused by: java.lang.NullPointerException
> > at 
> java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262) 
>
> > at 
> java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225) 
>
> > at 
> java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
> > at 
> java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719) 
>
> > at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
> > at java.base/java.security.AccessController.doPrivileged(Native Method)
> > at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
> > at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
> > at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
> > ... 12 mor
> >
> > If there is no known issue for that, is it worth to file a Bug for 
> it? (I Need to recreate it with a Oracle OpenJDK binary yet if it is 
> only a fontconfig Problem – but in that case a null check is probably 
> also a good thing?)
> >
> > Gruss
> > Bernd
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/2d-dev/attachments/20190304/2674027d/attachment-0001.html>


More information about the 2d-dev mailing list