Java 将RHEL从7.3升级到7.4:sun.font.CompositeStrike.getStrikeForSlot中的ArrayIndexOutOfBoundsException
我们刚刚将服务器从Java 将RHEL从7.3升级到7.4:sun.font.CompositeStrike.getStrikeForSlot中的ArrayIndexOutOfBoundsException,java,awt,redhat,openjdk,ibm-jdk,Java,Awt,Redhat,Openjdk,Ibm Jdk,我们刚刚将服务器从rhelv7.3升级到v7.4 这个简单的程序在RHELV7.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);
rhelv7.3
升级到v7.4
这个简单的程序在RHELV7.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);
}
}
RHEL 7.4中的例外情况是:
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)
rhelv7.4
的更新包括将openjdk
从1.8.0.131
更新为1.8.0.141
,但这似乎与openjdk
的版本无关,因为ibmjdk
的问题与webspherev9.0
(v1.8.0sr4fp6
)相同。在rhelv7.3
和rhelv7.4
服务器上使用相同版本的ibmjdk
,程序在rh7.3中工作,在rh7.4中失败的方式与openjdk
知道发生了什么吗?我们终于找到了RHEL v7.4(从v7.3升级或新安装)随附软件包
stix字体
安装此软件包后,默认字体从
Utopia
更改为STIX
因此,java现在将默认字体映射到STIX
,包括sans serif
font系列无论出于何种原因,
STIX
字体似乎不适合java(openjdk
++IBM JDK
),在使用java.awt
时会导致异常和错误的计算人工制品定位,而JasperReports
我们最终创建了一个文件名
/etc/fonts/local.conf
,以强制将Utopia
作为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>
[已编辑2019-06-28]
现在有一个修复程序可以解决IBMJDKV8.05.37中包含的问题
如果您只安装任何其他字体,如“dejavu衬线字体”,问题将得到解决。或者使用“local.conf”文件进行变通。RedHat在7.4中将该问题列为一个bug,并正在搜索真正的解决方案和依赖项:请看这里:Environment RHEL 7.4
使用OpenJDK或IBM JDK升级后,我们无法使用无衬线字体
openjdk 1.8.0.141-2中使用字体库的新异常。
决议
java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64中修复了该问题。RHSA-2017:2998-安全咨询
变通办法
据观察,在某些情况下,安装dejavu衬线字体可以修复此问题
yum install dejavu serif fonts如果有人在干净的Linux服务器实例上运行应用程序时遇到问题,请运行命令fc list并验证它是否有多个字体以及是否来自不同的文件夹,在我的情况下,路径/usr/share/X11/fonts/Type1/中有一些额外的字体,我删除了文件夹中的所有内容,问题解决了
<?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>