titou10 titou10 - 3 years ago 296
Java Question

Upgrade RHEL from 7.3 to 7.4: ArrayIndexOutOfBoundsException in sun.font.CompositeStrike.getStrikeForSlot

We just upgraded a server from

RHEL v7.3
to
v7.4
.

This simple program works in RHEL v7.3 and fails in v7.4

public class TestJava {
public static void main(String[] args) {
Font font = new Font("SansSerif", Font.PLAIN, 12);
FontRenderContext frc = new FontRenderContext(null, false, false);
TextLayout layout = new TextLayout("\ude00", font, frc);
layout.getCaretShapes(0);
System.out.println(layout);
}
}


The exception in RHEL 7.4 is :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:75)
at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
at sun.font.Font2D.getFontMetrics(Font2D.java:415)
at java.awt.Font.defaultLineMetrics(Font.java:2176)
at java.awt.Font.getLineMetrics(Font.java:2283)
at java.awt.font.TextLayout.fastInit(TextLayout.java:598)
at java.awt.font.TextLayout.<init>(TextLayout.java:393)


Te result on RHEL v7.3 is:

sun.font.StandardTextSource@7ba4f24f[start:0, len:1, cstart:0, clen:1, chars:"de00", level:0, flags:0, font:java.awt.Font[family=SansSerif,name=SansSerif,style=plain,size=12], frc:java.awt.font.FontRenderContext@c14b833b, cm:sun.font.CoreMetrics@412ae196]


The update of
RHEL v7.4
includes an update of
openjdk
from
1.8.0.131
to
1.8.0.141
but this does not seems to be related to the version of
openjdk
, as the problem is the same with the
IBM JDK
coming with
WebSphere v9.0
(
v1.8.0 SR4 FP6
). With the same version of the
IBM JDK
on a
RHEL v7.3
and
RHEL v7.4
server, the program works in RH 7.3 and fails in RH 7.4 the same way as with
openjdk


Any idea what's going on?

Answer Source

We finally found it !
RHEL v7.4 (upgraded from v7.3 or fresh install) comes with package stix-fonts.
When this package is installed, the default font changed from Utopiato STIX So, java now default fonts are mapped to STIX, including thesans-seriffont family
For whatever reason, the STIX fonts does not seem to play well with java (openjdk+ IBM JDK) and cause exceptions and bad calculated artefacts positionning when using java.awt, which is the case with JasperReports
We ended creating a file name /etc/fonts/local.conf with this in order to force back Utopia as the default font, used by java..

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <alias>
    <family>serif</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>dialog</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
  <alias>
    <family>dialoginput</family>
    <prefer><family>Utopia</family></prefer>
  </alias>
</fontconfig>
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download