Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将RHEL从7.3升级到7.4:sun.font.CompositeStrike.getStrikeForSlot中的ArrayIndexOutOfBoundsException_Java_Awt_Redhat_Openjdk_Ibm Jdk - Fatal编程技术网

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>