web-dev-qa-db-fra.com

Mettre à niveau RHEL de 7.3 à 7.4: ArrayIndexOutOfBoundsException dans Sun.font.CompositeStrike.getStrikeForSlot

Nous venons de mettre à niveau un serveur à partir de RHEL v7.3 à v7.4.

Ce programme simple fonctionne dans RHEL v7.3 et échoue dans 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);
  }
}

L'exception dans RHEL 7.4 est:

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)

Le résultat sur RHEL v7.3 est:

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]

La mise à jour de RHEL v7.4 inclut une mise à jour de openjdk de 1.8.0.131 à 1.8.0.141 mais cela ne semble pas être lié à la version de openjdk, car le problème est le même avec le IBM JDK avec WebSphere v9.0 (v1.8.0 SR4 FP6). Avec la même version du IBM JDK sur un RHEL v7.3 et RHEL v7.4 serveur, le programme fonctionne dans RH 7.3 et échoue dans RH 7.4 de la même manière qu'avec openjdk

Une idée de ce qui se passe?

10
titou10

Nous l'avons enfin trouvé!
RHEL v7.4 (mis à niveau depuis la v7.3 ou nouvelle installation) est livré avec le package stix-fonts.
Lorsque ce package est installé, la police par défaut est passée de Utopiaà STIX Ainsi, Java maintenant les polices par défaut sont mappées sur STIX, incluant lesans-seriffamille de polices
Pour une raison quelconque, les polices STIX ne semblent pas bien fonctionner avec Java (openjdk + IBM JDK) et provoquent des exceptions et un mauvais positionnement des artefacts calculés lors de l'utilisation de Java.awt, ce qui est le cas avec JasperReports
Nous avons terminé la création d'un nom de fichier /etc/fonts/local.conf avec ceci afin de forcer Utopia comme police par défaut, utilisée par 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>

[MODITÉ 2018-10-22]
Il semble que le bogue soit corrigé dans JDK 1.8.192: https://bugs.Java.com/view_bug.do?bug_id=JDK-81880

[MODITÉ 2019-06-28]
Il existe maintenant un correctif pour contourner le problème inclus dans IBM JDK v8.05.37 http://www-01.ibm.com/support/docview.wss?uid=swg1IJ16655

19
titou10

Environnement RHEL 7.4

Nous ne pouvons pas utiliser la police sans serif après la mise à niveau avec OpenJDK ou IBM JDK.

Nouvelle exception à l'aide des bibliothèques de polices dans openjdk 1.8.0.141-2. Résolution Le problème est résolu dans Java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64. RHSA-2017: 2998 - Solution de contournement pour les avis de sécurité

Il est observé que dans certains scénarios, l'installation de polices dejavu-serif résout le problème.

installer les polices dejavu-serif-yum

6
ALi Maken

si vous installez uniquement une autre police comme "dejavu-serif-fonts", le problème sera résolu. Ou vous effectuez la solution de contournement avec le fichier "local.conf". RedHat a répertorié le problème en tant que bogue en 7.4 et recherche une vraie solution et les dépendances: jetez un œil ici: https://bugzilla.redhat.com/show_bug.cgi?id=147956

4
kfu

Si quelqu'un a des problèmes pour exécuter une application sur une instance de serveur Linux propre, exécutez la commande fc-list et vérifiez si elle a plusieurs polices et à partir de différents dossiers, dans mon cas, j'avais quelques polices supplémentaires dans le chemin/usr/share/X11/fonts/Type1 /, j'ai tout supprimé du dossier et le problème a été résolu.

0
Wesley Silva