web-dev-qa-db-ja.com

Linuxで使用するための単純なJava fontconfig.propertiesファイルを構成する方法

カスタムJava 11ランタイムをカスタムLinuxハードウェアで使用しています。Javaランタイムは自分でビルドしていません。しかし、アプリケーションがフォントとランタイムは何も設定されていないので、このスタックトレースを取得します

Exception in thread "main" Java.lang.InternalError: Java.lang.reflect.InvocationTargetException
        at Java.desktop/Sun.font.FontManagerFactory$1.run(FontManagerFactory.Java:86)
        at Java.base/Java.security.AccessController.doPrivileged(Native Method)
        at Java.desktop/Sun.font.FontManagerFactory.getInstance(FontManagerFactory.Java:74)
        at Java.desktop/Java.awt.Font.getFont2D(Font.Java:497)
        at Java.desktop/Java.awt.Font.getFamily(Font.Java:1410)
        at Java.desktop/Java.awt.Font.getFamily_NoClientCode(Font.Java:1384)
        at Java.desktop/Java.awt.Font.getFamily(Font.Java:1376)
        at Java.desktop/Java.awt.Font.toString(Font.Java:1869)
        at Java.base/Java.lang.String.valueOf(String.Java:2951)
        at Java.base/Java.io.PrintStream.println(PrintStream.Java:897)
        at Fonts.main(Fonts.Java:7)
Caused by: Java.lang.reflect.InvocationTargetException
        at Java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
        at Java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
        at Java.base/Java.lang.reflect.Constructor.newInstance(Constructor.Java:490)
        at Java.desktop/Sun.font.FontManagerFactory$1.run(FontManagerFactory.Java:84)
        ... 10 more
Caused by: Java.lang.NullPointerException
        at Java.desktop/Sun.awt.FontConfiguration.getVersion(FontConfiguration.Java:1262)
        at Java.desktop/Sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.Java:225)
        at Java.desktop/Sun.awt.FontConfiguration.init(FontConfiguration.Java:107)
        at Java.desktop/Sun.awt.X11FontManager.createFontConfiguration(X11FontManager.Java:719)
        at Java.desktop/Sun.font.SunFontManager$2.run(SunFontManager.Java:367)
        at Java.base/Java.security.AccessController.doPrivileged(Native Method)
        at Java.desktop/Sun.font.SunFontManager.<init>(SunFontManager.Java:312)
        at Java.desktop/Sun.awt.FcFontManager.<init>(FcFontManager.Java:35)
        at Java.desktop/Sun.awt.X11FontManager.<init>(X11FontManager.Java:56) 

いくつかのフォントを提供でき、fontconfig.propertiesを作成してiをJava = runtimeslibフォルダーですが、fontconfig.propertiesに何を入力する必要があるかを理解するのに苦労しています。

誰かが、例外の発生を防ぐためにLinuxのfontconfig.propertiesで最小フォントセットを指定する方法の例を教えてもらえますか?.

より具体的には、libフォルダー内のfontsフォルダーに入れたTrueTypeフォントのセットがあるので、このセットを使用可能なフォントのセットとして使用するにはジャワ

  • LucidaBrightDemiItalic.ttf
  • LucidaBrightRegular.ttf
  • LucidaSansRegular.ttf
  • LucidaTypewriterRegular.ttf
  • LucidaBrightDemiBold.ttf
  • LucidaBrightItalic.ttf
  • LucidaSansDemiBold.ttf
  • LucidaTypewriterBold.ttf

空のfontconfig.propertiesファイルを作成すると、最初の例外は

Caused by: Java.lang.NullPointerException
        at Java.desktop/Sun.awt.FontConfiguration.getInitELC(FontConfiguration.Java:465)
        at Java.desktop/Sun.awt.FontConfiguration.initFontConfig(FontConfiguration.Java:441)
        at Java.desktop/Sun.awt.FontConfiguration.init(FontConfiguration.Java:108)
        at Java.desktop/Sun.awt.X11FontManager.createFontConfiguration(X11FontManager.Java:719)
        at Java.desktop/Sun.font.SunFontManager$2.run(SunFontManager.Java:367)
        at Java.base/Java.security.AccessController.doPrivileged(Native Method)
        at Java.desktop/Sun.font.SunFontManager.<init>(SunFontManager.Java:312)
        at Java.desktop/Sun.awt.FcFontManager.<init>(FcFontManager.Java:35)
        at Java.desktop/Sun.awt.X11FontManager.<init>(X11FontManager.Java:56)

Javaランタイムは少なくとも(空の)fontconfig.propertiesファイルを見つけているので、正しく構成できればこれは機能するはずです。

1つのファイルで最小限のfontconfig.propertiesファイルを作成しようとしましたが、機能しませんでした。

version=1

allfonts.plain.latin-1=-monotype-times new roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1

filename.-monotype-times new roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/SongKong/songkong/jre/lib/fonts/ipag.ttf

awtfontpath.latin-1=/mnt/app/opt/SongKong/songkong/jre/lib/fonts
2
Paul Taylor

Jdkリリースにはフォントが付属していませんが、Oracleリリースには一般的に付属しているため、Oracleリリースをダウンロードしてその機能を確認することを考えましたが、fontconfig.propertiesファイルはWindowsとUNIXのリリースで大きく異なるため、UNIXのリリースが必要でした。

最初にjdk-11.0.6_linux-x64_bin.tar.gzをダウンロードしましたが、これはfontconfig.propertiesファイルがありませんでした。特に何よりも縛られています。私のメインの開発マシンはWindowsなので、.debや.rpmビルドを試してみようとは思いませんでした。インストールする簡単な方法がないからです。代わりに、Solaris jdk-11.0.6_solaris-sparcv9_bin.tar.gzをダウンロードして解凍しました。

これには、この構造に従うfont.properties.srcファイルが含まれていました

Version =1
# Component Font Mappings
# Search Sequences
# Font Filenames
# AWT X11 font paths

私の理解は、コンポーネントフォントマッピングからJavaコンポーネントフォントへのマップです論理フォント名検索シーケンスは、フォントを検索する順序を指定しますJavaコンポーネントフォントに基づいています。フォントファイル名は、論理フォント名から実際のファイル名フォントがマシン上にある場所AWT X11フォントパスは、コンポーネントのフォント名からactual folderマシン上の実際のフォントが含まれています。

だから私はファイルの検索と置換を行いました実際のファイル名をサーバー上の私のフォントの場所。actual folderを実際のフォントを含むフォルダーの場所に置き換えます。

次に、この変更されたfontconfig.proprties.srcfontconfig.propertiesに名前変更して、jre/libフォルダーに保存しました

以前は失敗していた単純なテストプログラムが機能するようになりました

import Java.awt.*;
public class Fonts
{
     public static void main(String[] args) throws Exception
     {
         Font defaultFont = Font.decode(null);
         System.out.println(defaultFont);
     }
}

ただし、さまざまなスクリプトやさまざまなスタイル(プレーン、ボールドなど)に使用するフォント(ipag.ttf)を1つだけ指定しました。

プログラムを実行すると、jakarta.poiで(Excelスプレッドシートファイルを作成するために)フォントを使用する必要があるため、次の例外が発生します。

Java.lang.ClassCastException: class Sun.font.CompositeFont cannot be cast to class Sun.font.PhysicalFont (Sun.font.CompositeFont and Sun.font.PhysicalFont are in module Java.desktop of loader 'bootstrap')
    at Java.desktop/Sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.Java:1086)
    at Java.desktop/Sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.Java:965)
    at Java.desktop/Sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.Java:903)
    at Java.desktop/Sun.font.SunFontManager.findDeferredFont(SunFontManager.Java:919)
    at Java.desktop/Sun.font.SunFontManager.findFont2D(SunFontManager.Java:2120)
    at Java.desktop/Java.awt.Font.getFont2D(Font.Java:506)
    at Java.desktop/Java.awt.Font.canDisplayUpTo(Font.Java:2246)
    at Java.desktop/Java.awt.font.TextLayout.singleFont(TextLayout.Java:469)
    at Java.desktop/Java.awt.font.TextLayout.<init>(TextLayout.Java:530)
    at org.Apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.Java:275)

ここでの問題はPhysical fontが予期されていたことですが、太字、斜体フォントecteraを指定していないため、Javaへの変更に基づいてフォントを作成しようとします物理フォント、作成複合フォント。ただし、Javaは常にいくつかの基本的なスタイルに物理フォントが提供されることを期待しています。

そこで、Lucidaフォントをfonts dirにコピーし、fontconfigを変更しました。これらのフォントバリエーションを使用するプロパティファイルは次のとおりです。

filename.-monotype-arial-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansRegular.ttf
filename.-monotype-arial-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansRegular.ttf
filename.-monotype-arial-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansDemiBold.ttf
filename.-monotype-arial-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansDemiBold.ttf
filename.-monotype-courier_new-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterRegular.ttf
filename.-monotype-courier_new-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterRegular.ttf
filename.-monotype-courier_new-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterBold.ttf
filename.-monotype-courier_new-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterBold.ttf
filename.-monotype-times_new_roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightRegular.ttf
filename.-monotype-times_new_roman-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightItalic.ttf
filename.-monotype-times_new_roman-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightDemiBold.ttf
filename.-monotype-times_new_roman-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightDemiItalic.ttf

東南アジアのスクリプト用のipag.ttfを保持し、アプリケーションを再起動しただけで、それは機能しました。これがすべての状況で機能するかどうかはわかりません。

0
Paul Taylor