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?
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-serif
famille 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
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.
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
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.