Temurin-build: NPE في sun.awt.FontConfiguration.getVersion (FontConfiguration.java:1264) عند استخدام install4j الناجم عن فقدان تهيئة الخط

تم إنشاؤها على ٢٩ أكتوبر ٢٠١٨  ·  22تعليقات  ·  مصدر: adoptium/temurin-build

أهلا،
واجه فريقنا مشكلة NPE في install4j على توزيعات Linux المختلفة. (Ubuntu ، Centos ، Debian ، إلخ)
إصدار JDK: jdk8u181-b13

عند تثبيت منتجنا باستخدام installer4j ، حصلنا على استثناء مؤشر فارغ بسبب عدم وجود fontconfig وتتبع المكدس كما يلي:

java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) at sun.awt.FontConfiguration.init(FontConfiguration.java:107) at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) at sun.font.SunFontManager$2.run(SunFontManager.java:431) at java.security.AccessController.doPrivileged(Native Method) at sun.font.SunFontManager.<init>(SunFontManager.java:376) at sun.awt.FcFontManager.<init>(FcFontManager.java:35) at sun.awt.X11FontManager.<init>(X11FontManager.java:57) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) at java.security.AccessController.doPrivileged(Native Method) at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) at sun.font.SunFontManager.getInstance(SunFontManager.java:250) at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:264) at sun.swing.SwingUtilities2.getFontMetrics(SwingUtilities2.java:1113) at javax.swing.JComponent.getFontMetrics(JComponent.java:1626) at javax.swing.text.WrappedPlainView.updateMetrics(WrappedPlainView.java:318) at javax.swing.text.WrappedPlainView.updateChildren(WrappedPlainView.java:297) at javax.swing.text.WrappedPlainView.insertUpdate(WrappedPlainView.java:463) at javax.swing.plaf.basic.BasicTextUI$RootView.insertUpdate(BasicTextUI.java:1610) at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1869) at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201) at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748) at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707) at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130) at javax.swing.text.DefaultEditorKit.read(DefaultEditorKit.java:273) at javax.swing.JEditorPane.setText(JEditorPane.java:1416) at javax.swing.JEditorPane.<init>(JEditorPane.java:290) at com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.init(AbstractHeadlessScreenExecutor.java:68) at com.install4j.runtime.installer.frontend.headless.ConsoleScreenExecutor.<init>(ConsoleScreenExecutor.java:24) at com.install4j.runtime.installer.frontend.headless.InstallerConsoleScreenExecutor.<init>(InstallerConsoleScreenExecutor.java:6) at com.install4j.runtime.installer.Installer.getScreenExecutor(Installer.java:88) at com.install4j.runtime.installer.Installer.runInProcess(Installer.java:57) at com.install4j.runtime.installer.Installer.main(Installer.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85) at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:62)

نستخدم حاليًا حلًا بديلًا لتثبيت تبعية الخط بواسطة
apt install fontconfig

ومع ذلك ، سيغير هذا الحل البديل السلوك عندما ينتقل عميلنا من Oracle jdk إلى AcceptOpenJDK ، ويظل مشكلة توافق بالنسبة لنا.

هل يفكر الفريق في تجميع تكوين الخط في JDK والمساعدة في إصلاحه في إصدارات أخرى؟

هتافات،

التوزيع: jdk8u181-b13 Linux x64

bug x-linux

التعليق الأكثر فائدة

أدى تثبيت حزم fontconfig و urw-Fonts على CentOS 6 & 7 إلى إصلاح المشكلة.

ال 22 كومينتر

التفكير بصوت عالٍ - يبدو هذا وكأنه مشكلة نحتاج فيها إلى الحصول على المنبع لدعم هذا الدعم من Java 11 أو شخص ما لإضافة تصحيح إلى مشروع 8u.

قد تكون مشكلة في برنامج التثبيت أيضًا ، دعنا نرى.

karianna يقوم المثبت JEditorPane.setText() ويمر عبر مسار الكود هذا

java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) at sun.awt.FontConfiguration.init(FontConfiguration.java:107) at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) at 

يحدث ذلك لأن دليل الخطوط الذي يجب أن يوفره تطبيق OpenJDK غير موجود

إنه لأمر رائع أن نتمكن من دعم ذلك من مشروع Java 11 إلى 8u.

التفكير بصوت عالٍ - يبدو هذا وكأنه مشكلة نحتاج فيها إلى الحصول على المنبع لدعم هذا الدعم من Java 11 أو شخص ما لإضافة تصحيح إلى مشروع 8u.

قد تكون مشكلة في برنامج التثبيت أيضًا ، دعنا نرى.

يا @ karianna شكرا على التعليقات.

هل سيكون هناك جدول زمني تقديري لمعالجة هذه المشكلة ، على سبيل المثال في المدى القصير (أسابيع) ، أو على المدى الطويل (أشهر)؟
ستكون هذه المعلومات مفيدة لنا لتخطيط الدعم لعملائنا وتقليل التأثير السلبي.

ربما على المدى الطويل في هذه المرحلة.

NullPointerException في FontConfiguration. java: 1264 ناتج عن فقدان ملف تكوين الخط ، والذي لم يتم تضمينه مع إصدار Linux من تبنّي اوبن جي دي كيه. من المهم ملاحظة أن السبب المباشر للاستثناء هو ملف _configuration_ مفقود وليس ملفات الخطوط الفعلية مفقودة.

عند تهيئة النظام الفرعي لخطوط AWT ، سيبحث عن ملف تكوين الخط في $ JAVA_HOME / lib باتباع نظام التسمية والأولوية كما هو موضح هنا: https://docs.oracle.com/javase/8/docs/technotes/guides /intl/fontconfig.html

حتى إذا لم يتم توفير أي خطوط بواسطة JDK ولم يكن استخدام الخطوط المقدمة من نظام التشغيل مقصودًا أو مهيئًا ، فإن الحد الأدنى من التكوين مطلوب من قبل النظام الفرعي لخطوط AWT للتهيئة دون طرح استثناءات. سيؤدي توفير ملف fontconfig.properties في $ JAVA_HOME / lib مع السطرين التاليين ، على الأقل ، إلى التخفيف من مشكلة NullPointerException:

version=1
sequence.allfonts=default

نظرًا لأن _ نحن_ نستخدم الخطوط المجمعة مع تطبيقنا فقط ، فهذا حل بديل في حالتنا. يسمح لنظام الخط الفرعي بالتهيئة ويمكننا لاحقًا دون مشاكل تحميل الخطوط الخاصة بنا من مسار الفصل. لست متأكدًا مما يحدث و YMMV إذا حاولت تشغيل تطبيق يعتمد على JDK لتوفير الخطوط الفعلية ، إما مجمعة مع JDK أو على النحو المنصوص عليه من قبل نظام التشغيل.

نفس المشكلة مع fontconfig 2: 2.13.1 (على نظام arch linux). حاولت تحميل مكتبة fontconfig يدويًا ورأيت الخطأ التالي:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: /usr/lib/libfontconfig.so.1.12.0: /usr/lib/libfontconfig.so.1.12.0: undefined symbol: FT_Done_MM_Var
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    ...

هذا يعني أن jre/lib/amd64/libfreetype.so.6 المضمن غير متوافق مع تنسيق خط النظام. أزلت jre/lib/amd64/libfreetype.so.6 وتم حل المشكلة.

jarnbjo شكرا على الحل الخاص بك. تمكنت من تخفيف المشكلة باستخدام NullPointerException في FontConfiguration. java: 1264 على alphine Linux

تواجه حاليا

Caused by: java.lang.NullPointerException: null
hub_1           |   at sun.awt.FcFontManager.getDefaultPlatformFont(FcFontManager.java:76)
hub_1           |   at sun.font.SunFontManager$2.run(SunFontManager.java:433)
hub_1           |   at java.security.AccessController.doPrivileged(Native Method)
hub_1           |   at sun.font.SunFontManager.<init>(SunFontManager.java:376)
hub_1           |   at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
hub_1           |   at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
hub_1           |   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
hub_1           |   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
hub_1           |   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
hub_1           |   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
hub_1           |   at java.lang.Class.newInstance(Class.java:442)
hub_1           |   at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
hub_1           |   at java.security.AccessController.doPrivileged(Native Method)
hub_1           |   at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:190)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:224)
hub_1           |   at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:252)
hub_1           |   at sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94)
hub_1           |   at net.sf.jasperreports.engine.util.JRGraphEnvInitializer.initializeGraphEnv(JRGraphEnvInitializer.java:57)

نقدر أي مساعدة !!
التوزيع: jdk8u202-b08 Linux x64

أدى تثبيت حزم fontconfig و urw-Fonts على CentOS 6 & 7 إلى إصلاح المشكلة.

مرحبًا @ keertz04 لقد واجهت نفس الشيء عند تصحيح الأخطاء في الكود المصدري. من خلال توفير fontconfig.properties ، يكون قادرًا على التخلص من NPE في FontConfiguration ، لكنه كشف عن NPE آخر كما أوضحت لأن خطوط النظام لا تزال غير متوفرة ، وسوف يطرح استثناءات عندما يحاول الحصول على خط النظام الأساسي الافتراضي.
حاليًا ، ما زلنا نستخدم الحل لتثبيت fontconfig

لمعلوماتك فقط للأشخاص الذين يستخدمون install4j ، فقد تضمن الإصدار الأخير 7.0.9 التغييرات
Added a workaround for an InternalError when a bundled JRE could not find fonts on Linux
https://www.ej-technologies.com/download/install4j/changelog.html

لم يقم فريقنا بالترقية إلى هذا الإصدار ، أعتقد أنه قد يكون من المفيد التنبيه هنا على الرغم من ذلك.

+1 لحل مشكلة fontconfig ، ولم تكن بحاجة إلى استخدام fontconfig.properties. (jdk8u202-b08)

@ xinyi9 التقاط جيد مع ملاحظة الإصدار install4j. لسوء الحظ ، حاولت للتو إنشاء مُثبِّت باستخدام install4j 7.0.9 وما زلت أرى المشكلة:
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) at sun.awt.FontConfiguration.init(FontConfiguration.java:107) at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) at sun.font.SunFontManager$2.run(SunFontManager.java:431) ..... at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85) at com.install4j.runtime.launcher.UnixLauncher.main(UnixLauncher.java:62)

هذا موجود على x86_64 Clearlinux 4.14.21-380.lts ، باستخدام jdk8u192-b12

تواجه حاليا

""
السبب: java.lang.NullPointerException: null
hub_1 | في sun.awt.FcFontManager.getDefaultPlatformFont (FcFontManager.java:76)
hub_1 | في sun.font.SunFontManager $ 2.run (SunFontManager.java:433)

@ keertz04 هو نفسه بالنسبة لي ، بعد تثبيت fontconfig وإضافة fontconfig.properties.
لذلك لم يتم إصلاحه ، على جبال الألب.

باستخدام adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
كان علي فقط أن أجري:
apk add --no-cache fontconfig ttf-dejavu

أدى تثبيت fontconfig على خادم Ubuntu 16.04 إلى إصلاح المشكلة بالنسبة لي. لا حاجة لإضافة fontconfig.properties لحسن الحظ (يجعل ترقيات OpenJDK أسهل):

$ sudo apt-get install fontconfig
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1
The following NEW packages will be installed:
  fontconfig fontconfig-config fonts-dejavu-core libfontconfig1
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/1398 kB of archives.
After this operation, 4490 kB of additional disk space will be used.

يبدو أن fonts-dejavu-core مهم أيضًا. بدونه يحدث استثناء آخر.

باستخدام JRE 11 (نعم ، تنزيل JRE ، وليس JDK):

$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)

استبدل الصورة بجافا: 8 ، ممتاز!

في Red Hat 7.7 ، جربنا أولاً إنشاء fontconfig.properties بدون فرح.
كان لدينا fontconfig مثبتًا ، لكن ليس خطوط urw.
أدى تثبيت الحزمة التي تم استبدالها urw-base35-Fonts إلى حل المشكلة.

في Red Hat 7.7 ، جربنا أولاً إنشاء fontconfig.properties بدون فرح.
كان لدينا fontconfig مثبتًا ، لكن ليس خطوط urw.
أدى تثبيت الحزمة التي تم استبدالها urw-base35-Fonts إلى حل المشكلة.

أهلا،

بالنسبة لي ، كان ذلك كافيًا لتثبيت fontconfig المفقود وتقديم fontconfig.properties المذكورة سابقًا في $ JAVA_HOME / lib.

حسدتي:
اعتماد بيئة وقت التشغيل OpenJDK OpenJDK (الإصدار 14.0.1 + 7)
fontconfig-2.13.0-4.3.el7.x86_64

jarnbjo شكرا على الحل الخاص بك. تمكنت من تخفيف المشكلة باستخدام NullPointerException في FontConfiguration. java: 1264 على alphine Linux

تواجه حاليا

Caused by: java.lang.NullPointerException: null
hub_1           |     at sun.awt.FcFontManager.getDefaultPlatformFont(FcFontManager.java:76)
hub_1           |     at sun.font.SunFontManager$2.run(SunFontManager.java:433)
hub_1           |     at java.security.AccessController.doPrivileged(Native Method)
hub_1           |     at sun.font.SunFontManager.<init>(SunFontManager.java:376)
hub_1           |     at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
hub_1           |     at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
hub_1           |     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
hub_1           |     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
hub_1           |     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
hub_1           |     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
hub_1           |     at java.lang.Class.newInstance(Class.java:442)
hub_1           |     at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
hub_1           |     at java.security.AccessController.doPrivileged(Native Method)
hub_1           |     at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:190)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:224)
hub_1           |     at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:252)
hub_1           |     at sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94)
hub_1           |     at net.sf.jasperreports.engine.util.JRGraphEnvInitializer.initializeGraphEnv(JRGraphEnvInitializer.java:57)

نقدر أي مساعدة !!
التوزيع: jdk8u202-b08 Linux x64

مرحبًا ، لقد أمضيت أيامًا أعاني من ذلك حتى رأيت خيط جيثب هذا وجعلت الليل سعيدًا

https://github.com/corretto/corretto-11/issues/124#issuecomment -675629775

لاحظ عدم وجود خطوط في إصدار Linux اعتماد OpenJDK / openjdk-support # 70

باستخدام adoptopenjdk/openjdk11-openj9:jdk-11.0.7_10_openj9-0.20.0-alpine-slim
كان علي فقط أن أجري:
apk add --no-cache fontconfig ttf-dejavu

يعمل هذا أيضًا على إصلاح المشكلة إذا كانت حاوية Docker الخاصة بك مبنية فوق

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات