web-dev-qa-db-ja.com

OpenJdkで、appendedfontpathプロパティを使用してフォントディレクトリを設定するにはどうすればよいですか?

appendedfontpathプロパティを使用して、OpenJdkインストールの特定の場所からフォントを使用するようにアプリケーションを取得しようとしていますが、機能しません。

../jre1.8.0_121+1/bin/Java  -Dappendedfontpath=/usr/lib/fonts/  -jar lib/songkong-4.7.jar -m /mnt/disk1/share

フォントがインストールされていないことを報告しますが、/ usr/lib/fontsフォルダーにはフォントipag.ttfが含まれています

ご注意ください:

  • OpenJdkには、システムにインストールされているフォントに依存するフォントがプリインストールされていません。
  • これは、サーバーにフォントがインストールされていないことを報告する組み込みシステムです。fc-listは何も返しません。
  • フォントをjre/lib/fontsフォルダーにコピーすると機能しますが、このフォルダーに何もコピーすることはできません。
  • また、fc-cache -fなどのrootコマンドを実行することも許可されていません

フォントを含むフォントフォルダを指定するだけで機能させることができれば、それは私にとって有効な解決策になります。

14
Paul Taylor

JVMを起動する前に_Java_FONTS_環境変数を設定して、ディレクトリパスを認識させることができます。あなたの場合、これは_export Java_FONTS=/usr/lib/fonts_によって行うことができます。私の答えは Java Runtime Enviroment fonts archlinuxwikiの記事に基づいています。


編集:
フォントがインストールされていないVM)でのテストでは、Java_FONTSの設定が機能しないことが示され、セットアップでは目標を達成できない可能性があるという結論に達しました。
次のプログラムを使用して、フォントがインストールされていないVM)でエラーを再現しました。

_import javax.swing.*;
public class example{

    public static void main(String[] tArgs){
        JFrame j = new JFrame();
        j.add(new JButton("Test"));
        j.setVisible(true);
        j.pack();
   }

}
_

これが私のスタックトレースです: https://Pastebin.com/fy3JDnkN
X11FontManager のソースを考えると、フォントマネージャーがfor (int i=0; i<fontConfigFonts.length; i++) {の行に構築されているときにエラーが発生します。

_public String[] getDefaultPlatformFont() {
    if (defaultPlatformFont != null) {
        return defaultPlatformFont;
    }
    String[] info = new String[2];
    getFontConfigManager().initFontConfigFonts(false);
    FontConfigManager.FcCompFont[] fontConfigFonts =
        getFontConfigManager().getFontConfigFonts();
    for (int i=0; i<fontConfigFonts.length; i++) {
        if ("sans".equals(fontConfigFonts[i].fcFamily) &&
            0 == fontConfigFonts[i].style) {
            info[0] = fontConfigFonts[i].firstFont.familyName;
            info[1] = fontConfigFonts[i].firstFont.fontFile;
            break;
        }
    }
    /* Absolute last ditch attempt in the face of fontconfig problems.
     * If we didn't match, pick the first, or just make something
     * up so we don't NPE.
     */
    if (info[0] == null) {
        if (fontConfigFonts.length > 0 &&
            fontConfigFonts[0].firstFont.fontFile != null) {
            info[0] = fontConfigFonts[0].firstFont.familyName;
            info[1] = fontConfigFonts[0].firstFont.fontFile;
        } else {
            info[0] = "Dialog";
            info[1] = "/dialog.ttf";
        }
    }
    defaultPlatformFont = info;
    return defaultPlatformFont;
}
_

これにより、フォントマネージャーにアクセスする前にNullPointerExceptionが発生するため、フォントを手動で追加できなくなります。この動作は、数行後のコメントを考えると意図されていないように見えます。

デフォルトのシステムフォントがインストールされていなくてもクラッシュしないLinux用の別のFontManagerがあれば、目標を達成できる可能性がありますが、そのような代替品は見つかりませんでした。

2
Skgland

1つの解決策は、フォントを独自のjarにパックして、 this のようなことを試みることです。

1
C Prasoon

フォントディレクトリを指定する必要はありません。マシンにインストールされている場合、JREはフォントを自動的に選択します。

私も過去にこの問題に直面していて、githubにフォントを含むビルド済みのオープンJREパッケージを見つけました。これらのパッケージは、クラスパス例外を除いてGNUGPLv。2でリリースされます。

https://github.com/ojdkbuild/ojdkbuild/releases/tag/1.8.0.121-1

Linuxバージョン(Java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64.Zip)をダウンロードするか、リリースの下で121以外の更新を探すことができます。

注:必要に応じて、不足しているTrueTypeフォントをjre/lib/fontsの下に含めることもできます。

代替オプションI

必要なフォントをマシンにインストールします。これはシームレスに機能し、JREで何も構成する必要はありません。

注意:

  • フォントをインストールする権限がない場合は、fonts/usr/share/fontsディレクトリをコピーできます。
  • 読み取り専用パーティションの場合は、パーティションを読み取り/書き込みモードでマウントし、フォントファイルをコピーできます。
  • / usr/share/fontsが属するパーティションにスペースが残っていない場合は、ファイルを別のディレクトリにコピーして、そのディレクトリにソフトリンクを作成できます。

代替オプションII

Jre/lib/fontsディレクトリにフォントを含め(存在しない場合はfontsディレクトリを作成します)、jre/libにfontconfig.propertiesファイルを設定します。このオプションはテストしていませんが、機能するはずです。

編集:

  • フォントがすでにマシンにインストールされている場合、JVMはフォントを自動的に選択する必要があります。それ以外の場合は、Java_FONTS環境変数を使用して、@ BdoubleB97の回答に記載されているフォントを指定できます。
  • 環境変数を設定する権限がない場合は、以下のように実行時に環境変数を渡すことができます。

    ./Java -DJAVA_FONTS =/usr/share/fontsテスト

1

フォントの標準的なシステムの場所は、/ usr/share/fontsとサブディレクトリです(fontconfigと# fc-cache -fを参照)。/usr/lib/fontsは、約14年前に廃止された無数の非標準の場所の1つです。そのため、システムとOpenJDKはフォントを見つけることができません。

従来のSunJVMとは異なり、OpenJDKは実際にシステムと統合し、システムリソースを使用しようとします(Windowsだけでなく)。

0
nim