Подтвердить что ты не робот

В OpenJdk как установить dir с атрибутом appendfontpath

Я пытаюсь заставить мое приложение использовать шрифты из определенного места в установке OpenJdk, используя свойство appendedfontpath, но оно не работает для меня.

../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

Если бы я мог заставить его работать, просто указав папку шрифта, содержащую шрифты, это было бы рабочим решением для меня.

4b9b3361

Ответ 1

Вы можете попытаться установить переменную среды JAVA_FONTS для запуска JVM, чтобы узнать о пути к каталогу. Для вашего случая это можно сделать с помощью export JAVA_FONTS=/usr/lib/fonts. Мой ответ основан на Java Runtime Enviroment fonts статьи вики archlinux.


EDIT:
Тест в виртуальной машине без установленных шрифтов показывает, что настройка JAVA_FONTS не работает и я пришел к выводу, что с вашей настройкой, возможно, не удастся достичь своей цели.
Я использовал следующую программу для воспроизведения ошибки на виртуальной машине без установленных шрифтов:

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();
   }

}

Вот моя Stacktrace: 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 происходит до того, как мы получим доступ к диспетчеру шрифтов, это поведение швов, чтобы они не были предназначены, если оставить комментарий пару строк позже.

Возможно, вам удастся достичь своей цели, если есть еще один FontManager для Linux, который не сбой при отсутствии стандартного системного шрифта, но я не мог найти такую ​​замену.

Ответ 2

Одним из решений может быть упаковка шрифтов в вашей собственной банке и попытка сделать что-то вроде этого.

Ответ 3

Вам не нужно указывать каталог шрифтов. Если он установлен на вашем компьютере, JRE автоматически выбирает шрифты.

В прошлом я столкнулся с этой проблемой и нашел готовые открытые пакеты JRE со шрифтами в github. Эти пакеты выпущены под GNU GPL v. 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, а также в выпусках.

Примечание. Вы также можете включить отсутствующие шрифты True Type под jre/lib/fonts, если это необходимо.

Альтернативный вариант I

Установка необходимых шрифтов на вашем компьютере. Это будет работать без сбоев, и вам не нужно ничего настраивать в JRE.

Примечание:

  • Если у вас нет прав на установку шрифтов, вы можете очень хорошо скопировать каталог fonts/usr/share/fonts.
  • Если это раздел только для чтения, вы можете подключить раздел в режиме чтения-записи и скопировать файлы шрифтов.
  • Если в разделе, где принадлежит /usr/share/fonts, нет места, вы можете скопировать файлы в другой каталог и сделать мягкую ссылку на него.

Альтернативный вариант II

Включая шрифты в каталог jre/lib/fonts (создайте каталог шрифтов, если он не существует) и настройте файл fontconfig.properties в jre/lib. Я не тестировал этот вариант, но он должен работать.

Edit:

  • Если шрифты уже установлены в машине, JVM должен автоматически выбирать шрифты. В противном случае вы можете указать шрифты, как указано в ответе @BdoubleB97, используя переменную среды JAVA_FONTS.
  • Если у вас нет разрешения на установку переменной среды, вы можете передать переменную среды во время выполнения, как показано ниже.

    ./java -DJAVA_FONTS =/usr/share/fonts Test

Ответ 4

Стандартным расположением системы для шрифтов является /usr/share/fonts и подкаталоги (см. fontconfig и # fc-cache -f)./usr/lib/fonts является одним из нестандартных местоположений miriad, которые были устаревшими ~ 14 лет назад, поэтому система и OpenJDK не могут найти ваши шрифты.

В отличие от старых JVM SUN OpenJDK фактически пытается интегрироваться с системой и использовать системные ресурсы (не только под Windows).