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
が含まれています
ご注意ください:
fc-list
は何も返しません。fc-cache -f
などのrootコマンドを実行することも許可されていませんフォントを含むフォントフォルダを指定するだけで機能させることができれば、それは私にとって有効な解決策になります。
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があれば、目標を達成できる可能性がありますが、そのような代替品は見つかりませんでした。
1つの解決策は、フォントを独自のjarにパックして、 this のようなことを試みることです。
フォントディレクトリを指定する必要はありません。マシンにインストールされている場合、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で何も構成する必要はありません。
注意:
代替オプションII
Jre/lib/fontsディレクトリにフォントを含め(存在しない場合はfontsディレクトリを作成します)、jre/libにfontconfig.propertiesファイルを設定します。このオプションはテストしていませんが、機能するはずです。
編集:
環境変数を設定する権限がない場合は、以下のように実行時に環境変数を渡すことができます。
./Java -DJAVA_FONTS =/usr/share/fontsテスト
フォントの標準的なシステムの場所は、/ usr/share/fontsとサブディレクトリです(fontconfigと# fc-cache -f
を参照)。/usr/lib/fontsは、約14年前に廃止された無数の非標準の場所の1つです。そのため、システムとOpenJDKはフォントを見つけることができません。
従来のSunJVMとは異なり、OpenJDKは実際にシステムと統合し、システムリソースを使用しようとします(Windowsだけでなく)。