代码之家  ›  专栏  ›  技术社区  ›  titou10

在sun.font.CompositeStrike.getStrikeForSlot中,将RHEL从7.3升级到7.4:ArrayIndexOutOfBoundsException

  •  10
  • titou10  · 技术社区  · 7 年前

    RHEL v7.3 v7.4

    这个简单的程序在RHEL v7.3中工作,在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);
      }
    }
    

    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)
    

    RHEL v7.3上的Te结果为:

    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]
    

    的更新 RHEL v7.4 openjdk 从…起 1.8.0.131 1.8.0.141 但这似乎与 openjdk ,因为问题与 IBM JDK 即将推出 WebSphere v9.0 v1.8.0 SR4 FP6 ). 使用相同版本的 IBM JDK RHEL v7.4 服务器,该程序在RH 7.3中工作,在RH 7.4中失败的方式与

    知道发生了什么吗?

    4 回复  |  直到 7 年前
        1
  •  20
  •   titou10    5 年前

    我们终于找到了!
    RHEL v7.4(从v7.3升级或新安装)附带软件包 stix-fonts .
    安装此软件包后,默认字体从 Utopia STIX 因此,java现在将默认字体映射到 ,包括 sans-serif 字体系列
    无论出于何种原因 STIX公司 openjdk + IBM JDK )使用时会导致异常和错误的计算伪影定位 java.awt ,情况就是这样 JasperReports
    /etc/fonts/local.conf 用这个来逼回去 作为默认字体,由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>
    

    【2018年10月22日编辑】
    JDK 1.8.192中的错误似乎已经修复: https://bugs.java.com/view_bug.do?bug_id=JDK-8188030

    【2019-06-28编辑】
    现在有一个修复程序可以解决IBM JDK v8.05.37中包含的问题 http://www-01.ibm.com/support/docview.wss?uid=swg1IJ16655

        2
  •  7
  •   Community Dai    4 年前

    环境RHEL 7.4

    openjdk 1.8.0.141-2中使用字体库的新异常。 决议 解决方法

    据观察,在某些情况下,安装dejavu衬线字体可以修复该问题。

    yum安装dejavu衬线字体

        4
  •  0
  •   José Oliveira    5 年前

    如果有人在干净的Linux服务器实例上运行应用程序时遇到问题,请运行命令fc list并验证它是否有多个字体以及来自不同文件夹。在我的情况下,我在路径/usr/share/X11/fonts/Type1/中有一些额外的字体,我删除了文件夹中的所有内容,问题得到了解决。