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@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@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:[email protected]>
*Gesendet: *Donnerstag, 28. Februar 2019 09:56
*An: *2d-dev <mailto:[email protected]>
*Cc: *Java Core Libs <mailto:[email protected]>
*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 <[email protected]>
*Gesendet:* Donnerstag, Februar 28, 2019 12:45 AM
*An:* Bernd Eckenfels; 2d-dev
*Cc:* [email protected]; 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

Reply via email to