Estoy tratando de hacer que mi aplicación use fuentes de una ubicación particular en una instalación de OpenJdk usando la propiedad appendedfontpath pero no funciona para mí.
../jre1.8.0_121+1/bin/java -Dappendedfontpath=/usr/lib/fonts/ -jar lib/songkong-4.7.jar -m /mnt/disk1/share informando que no hay fuentes instaladas, pero la carpeta /usr/lib/fonts contiene una fuente ipag.ttf
Tenga en cuenta:
fc-list no devuelve nadafc-cache -fSi pudiera hacerlo funcionar simplemente especificando una carpeta de fuentes que contenga fuentes, sería una solución funcional para mí.
Puede intentar configurar la variable de entorno JAVA_FONTS antes de iniciar la JVM para que conozca la ruta del directorio. Para su caso, esto podría hacerse export JAVA_FONTS=/usr/lib/fonts . Mi respuesta se basa en el artículo de fuentes Java Runtime Enviroment de la wiki de archlinux.
EDITAR:
La prueba en una máquina virtual sin fuentes instaladas muestra que la configuración de JAVA_FONTS no funciona y he llegado a la conclusión de que con su configuración podría no ser posible lograr su objetivo.
Usé el siguiente programa para reproducir el error en una máquina virtual sin fuentes instaladas:
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(); } } Aquí está mi Stacktrace: https://pastebin.com/fy3JDnkN
Dada la fuente de X11FontManager , el error ocurre mientras el Administrador de fuentes se construye en la línea con 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; }Esto hace que sea imposible agregar fuentes manualmente ya que NullPointerException ocurre antes de que tengamos acceso al Administrador de fuentes, este comportamiento parece no estar previsto dado el comentario un par de líneas más adelante.
Todavía podría ser posible lograr su objetivo si hay otro FontManager para Linux que no se bloquee sin una fuente de sistema predeterminada instalada, pero no pude encontrar ese reemplazo.
No necesita especificar el directorio de fuentes. Si está instalado en su máquina, el JRE seleccionará las fuentes automáticamente.
También enfrenté este problema en el pasado y encontré paquetes JRE abiertos preconstruidos con fuentes en github. Estos paquetes se publican bajo GNU GPL v. 2 con excepción de classpath.
https://github.com/ojdkbuild/ojdkbuild/releases/tag/1.8.0.121-1
Puede descargar la versión de Linux (java-1.8.0-openjdk-1.8.0.121-0.b13.el6_8.x86_64.zip) o puede buscar actualizaciones distintas de la 121 también en las versiones.
Nota: También puede incluir las fuentes True Type que faltan en jre/lib/fonts si es necesario.
Opción alternativa I
Instalación de las fuentes requeridas en su máquina. Esto funcionará a la perfección y no tendrá que configurar nada en el JRE.
Nota:
Opción alternativa II
Incluir las fuentes en el directorio jre/lib/fonts (crear directorio de fuentes si no existe) y configurar el archivo fontconfig.properties en jre/lib. No he probado esta opción, pero debería funcionar.
Editar:
Si no tiene permiso para establecer la variable de entorno, puede pasar la variable de entorno durante el tiempo de ejecución como se muestra a continuación.
./java -DJAVA_FONTS=/usr/share/fonts Prueba