نظام وحدات منصة جافا

يُحدد نظام وحدات منصة جافا ( JPMS ) تنسيق توزيع لمجموعات من أكواد جافا والموارد المرتبطة بها. [ 1 ] كما يُحدد مستودعًا لتخزين هذه المجموعات، أو الوحدات ، ويُبين كيفية اكتشافها وتحميلها والتحقق من سلامتها. ويتضمن ميزات مثل مساحات الأسماء بهدف معالجة بعض أوجه القصور في تنسيق JAR الحالي ، وخاصةً مشكلة "جحيم JAR " التي قد تؤدي إلى مشاكل مثل مسار الفئات وتحميل الفئات.

كان نظام وحدات جافا قيد التطوير في البداية في إطار عملية مجتمع جافا باسم JSR 277 وكان من المقرر إصداره مع جافا 7.

تم تعليق JSR 277 لاحقًا وتم إنشاء مشروع Jigsaw [ 2 ] لتقسيم JDK إلى وحدات. وقد تم استبدال JSR 376 (نظام وحدات منصة جافا) بهذا JSR.

كان مشروع Jigsaw مخصصًا في الأصل لإصدار Java 7 (2011)، ولكن تم تأجيله إلى Java 8 (2014) كجزء من الخطة البديلة، [ 3 ] ثم تم تأجيله مرة أخرى إلى إصدار Java 9 في عام 2017. [ 4 ] تم إصدار Java 9، بما في ذلك نظام وحدات Java، في 21 سبتمبر 2017. [ 5 ] [ 6 ]

بنيان

يتضمن نظام وحدات جافا المطبق في جافا 9 ما يلي من JEPs و JSR (طلب مواصفات جافا) : [ 2 ]

  • JEP 200: JDK المعياري: تحديد بنية معيارية لـ JDK
  • JEP 201: شفرة المصدر المعيارية: إعادة تنظيم شفرة مصدر JDK إلى وحدات، وتحسين نظام البناء لتجميع الوحدات، وفرض حدود الوحدات أثناء عملية البناء.
  • JEP 220: صور وقت التشغيل المعيارية: إعادة هيكلة صور وقت التشغيل JDK وJRE لاستيعاب الوحدات النمطية وتحسين الأداء والأمان وسهولة الصيانة
  • JEP 261: نظام الوحدات: تطبيق نظام الوحدات لمنصة جافا
  • JEP 282: رابط جافا: إنشاء أداة يمكنها تجميع وتحسين مجموعة من الوحدات النمطية وتوابعها في صورة وقت تشغيل مخصصة [ 7 ]
  • JSR 376: نظام وحدات منصة جافا [ 8 ]

بالإضافة إلى ذلك، تمت إضافة العديد من ميزات JDK 9 الأخرى لتسهيل الانتقال إلى نظام الوحدات النمطية:

  • JEP 238: ملفات JAR متعددة الإصدارات: توسيع تنسيق ملف JAR للسماح بوجود إصدارات متعددة خاصة بإصدارات Java من ملفات الفئات في أرشيف واحد. [ 9 ]
  • JEP 253: إعداد عناصر تحكم واجهة المستخدم JavaFX وواجهات برمجة تطبيقات CSS للنمطية: تحديد واجهات برمجة تطبيقات عامة لوظائف JavaFX التي لا تتوفر حاليًا إلا عبر واجهات برمجة التطبيقات الداخلية والتي ستصبح غير متاحة بسبب النمطية. [ 10 ]
  • JEP 260: تغليف معظم واجهات برمجة التطبيقات الداخلية: جعل معظم واجهات برمجة التطبيقات الداخلية لـ JDK غير متاحة افتراضيًا، مع إبقاء عدد قليل من واجهات برمجة التطبيقات الداخلية الهامة واسعة الاستخدام متاحة، إلى حين وجود بدائل مدعومة لجميع وظائفها أو معظمها. [ 11 ]
  • JEP 275: تغليف تطبيقات جافا المعيارية: سيتطور برنامج تغليف جافا في JDK 9، مما يجعله على دراية بالوحدات، مما يسمح على سبيل المثال بتغليف وحدة وجميع الوحدات التي تعتمد عليها. [ 12 ]

خصائص الوحدات

تُستخدم الوحدات النمطية لتجميع الحزم والتحكم بدقة في الحزم التي تنتمي إلى واجهة برمجة التطبيقات العامة. على عكس ملفات JAR ، تُعلن الوحدات النمطية صراحةً عن الوحدات النمطية التي تعتمد عليها، والحزم التي تُصدّرها. [ 13 ] تُحسّن إعلانات التبعية الصريحة سلامة الكود، من خلال تسهيل فهم التطبيقات الكبيرة والتبعيات بين مكونات البرمجيات.

يُوضع تعريف الوحدة في ملف باسم module-info.java في جذر تسلسل ملفات مصدر الوحدة. ويتحقق JDK من التبعيات والتفاعلات بين الوحدات أثناء الترجمة والتشغيل.

على سبيل المثال، يُعلن تعريف الوحدة التالي أن الوحدة org.wikipedia.barتعتمد على org.wikipedia.bazوحدة أخرى، وتُصدّر الحزم التالية: org.wikipedia.bar.alphaو org.wikipedia.bar.beta:

الوحدة org.wikipedia.bar { تتطلب org.wikipedia.baz؛ تصدير org.wikipedia.bar.alpha؛ تصدير org.wikipedia.bar.beta؛ }

ستكون العناصر العامة في org.wikipedia.bar.alphaالحزم متاحة للوحدات التابعة. أما العناصر الخاصة فلا يمكن الوصول إليها حتى باستخدام وسائل مثل الانعكاس . تجدر الإشارة إلى أنه في إصدارات جافا من 9 إلى 16، يعتمد السماح الفعلي بهذا "الوصول غير المصرح به" على إعدادات سطر الأوامر. [ 14 ]org.wikipedia.bar.beta

تم تقسيم JDK نفسه إلى وحدات نمطية في Java 9. [ 15 ] على سبيل المثال، يتم تصدير غالبية مكتبة Java القياسية بواسطة الوحدة النمطية java.base.

ابتداءً من Java 25، أصبح بالإمكان استيراد الوحدات النمطية نفسها، مما يؤدي إلى استيراد جميع الحزم المصدرة تلقائيًا. [ 16 ] يتم ذلك باستخدام import module. على سبيل المثال، يُعادل .importmodulejava.sql;

استيراد java.sql.* ؛ استيراد javax.sql.* ؛ // الصادرات غير المباشرة المتبقية من java.logging و java.transaction.xa و java.xml

وبالمثل ، يستورد جميع الحزم الـ 54 التابعة لـ .importmodulejava.base;java.base

package org.wikipedia.examples ;استيراد الوحدة النمطية java.base ؛/** * يسمح لنا استيراد الوحدة java.base بتجنب استيراد معظم الفئات يدويًا * يتم استخدام الفئات التالية (خارج java.lang): * - java.text.MessageFormat * - java.util.Date * - java.util.List * - java.util.concurrent.ThreadLocalRandom */ public class Example { public static void main ( String [] args ) { List < String > colors = List . of ( "Red" , "Orange" , "Yellow" , "Green" , "Blue" , ​​"Indigo" , "Violet" ); IO . println ( MessageFormat . format ( "My favorite colour is {0} and today is {1,date,long}" , colors . get ( ThreadLocalRandom . current (). nextInt ( colors . size ())), new Date () )); } }

تستخدم الوحدات النمطية الكلمات المفتاحية التالية :

  • exports: يُستخدم في تعريف الوحدة النمطية لتحديد الحزم المتاحة للوحدات النمطية الأخرى
  • module: يُعلن عن وحدة نمطية
  • openيشير هذا إلى أن جميع الفئات في الحزمة يمكن الوصول إليها عبر الانعكاس بواسطة وحدات أخرى
  • opens: تُستخدم لفتح حزمة معينة لعرضها على وحدات أخرى
  • provides: يُستخدم للإعلان عن أن الوحدة النمطية توفر تطبيقًا لواجهة خدمة
  • requires: يُستخدم في تعريف الوحدة النمطية لتحديد أن الوحدة النمطية تعتمد على وحدة نمطية أخرى
  • to: يُستخدم مع opensالتوجيه لتحديد الوحدة النمطية المسموح لها بالوصول إلى الحزمة بشكل انعكاسي
  • transitiveيُستخدم هذا مع requiresالتوجيه للإشارة إلى أن وحدةً ما لا تتطلب وحدةً أخرى فحسب، بل تُتيح أيضًا تبعيات تلك الوحدة للوحدات التي تعتمد عليها.
  • uses: يستخدم في وحدة نمطية للإعلان عن أن الوحدة النمطية تستخدم خدمة (أي أنها ستستهلك خدمة مقدمة من وحدات نمطية أخرى)
  • with: يُستخدم مع providesالتوجيه لتحديد أي تطبيق للخدمة يتم توفيره بواسطة الوحدة

الوحدات النمطية القياسية

الوحدات الأساسية

تنتمي الوحدات النمطية الموجودة ضمن مساحة الاسم java.*إلى منصة Java، الإصدار القياسي ، jdk.*وتنتمي الوحدات النمطية الموجودة ضمن مساحة الاسم إلى مجموعة أدوات تطوير Java . [ 17 ]

اسموصف
java.baseيحدد هذا القسم واجهات برمجة التطبيقات الأساسية التي تشكل أساس منصة Java SE.

مطلوب ضمنيًا من قبل جميع الوحدات ولا يحتاج إلى تعريف requiresداخل تعريف الوحدة.

java.compilerيحدد واجهات برمجة التطبيقات المتعلقة بنموذج اللغة، ومعالجة التعليقات التوضيحية في جافا ، ومترجم جافا .
java.datatransferيحدد واجهات برمجة التطبيقات التي تسهل نقل البيانات بين التطبيقات أو داخل تطبيق واحد.
java.desktopيحدد هذا البرنامج مجموعة أدوات النوافذ المجردة (AWT) ومكتبات Swing لواجهات المستخدم، بالإضافة إلى واجهات برمجة التطبيقات (APIs) لإمكانية الوصول والصوت والتصوير والطباعة و JavaBeans .
java.instrumentيحدد الخدمات التي تسمح بتجهيز البرامج التي تعمل على آلة جافا الافتراضية (JVM).
java.loggingيحدد واجهة برمجة التطبيقات لتسجيل الأحداث في تطبيقات جافا (واجهة برمجة تطبيقات تسجيل جافا).
java.managementيحدد واجهات برمجة التطبيقات لإطار عمل Java Management Extensions (JMX).
java.management.rmiيحدد موصل استدعاء الأساليب عن بعد (RMI) لواجهة برمجة التطبيقات عن بعد لملحقات إدارة جافا (JMX).
java.namingيحدد واجهة برمجة التطبيقات (API) لخدمات Java Naming and Directory Interface (JNDI).
java.net.httpيحدد واجهة برمجة التطبيقات (API) لعميل HTTP ووظائف WebSocket .
java.prefsيحدد واجهة برمجة التطبيقات لإدارة وتخزين تفضيلات المستخدم.
java.rmiيحدد واجهة برمجة تطبيقات استدعاء الأساليب عن بعد (RMI) للاتصال بالكائنات عبر الآلات الافتراضية لجافا.
java.scriptingيحدد واجهة برمجة التطبيقات (API) لدمج محركات البرمجة النصية في تطبيقات جافا (واجهة برمجة تطبيقات البرمجة النصية).
java.seيحدد واجهة برمجة التطبيقات القياسية لمنصة Java SE.
java.security.jgssيحدد ربط Java لواجهة برمجة تطبيقات خدمات الأمان العامة IETF (GSS-API) لسياقات الأمان.
java.security.saslيحدد دعم جافا لبروتوكول طبقة المصادقة والأمان البسيطة (SASL).
java.smartcardioيحدد واجهة برمجة التطبيقات للتفاعل مع أجهزة البطاقات الذكية (واجهة برمجة تطبيقات إدخال/إخراج البطاقات الذكية في جافا).
java.sqlيحدد واجهة برمجة تطبيقات Java Database Connectivity (JDBC) للتفاعل مع قواعد البيانات.
java.sql.rowsetيحدد واجهة برمجة تطبيقات JDBC RowSet لإدارة البيانات الجدولية والتفاعل معها في Java.
java.transaction.xaيُعرّف واجهة برمجة تطبيقات لإدارة المعاملات الموزعة داخل JDBC.
java.xmlيحدد واجهة برمجة تطبيقات جافا لمعالجة XML (JAXP)، بما في ذلك أدوات تحليل وتحويل بيانات XML.
java.xml.cryptoيحدد واجهة برمجة التطبيقات (API) للعمليات التشفيرية مع بيانات XML.
jdk.accessibilityيُعرّف فئات الأدوات المساعدة لتنفيذ التقنيات المساعدة في JDK.
jdk.attachيحدد واجهة برمجة التطبيقات (API) الخاصة بالاتصال والتفاعل مع مثيل JVM قيد التشغيل (واجهة برمجة التطبيقات الخاصة بالاتصال).
jdk.charsetsيوفر مجموعات أحرف إضافية ( charset s)، بما في ذلك مجموعات الأحرف ثنائية البايت ومجموعات الأحرف الخاصة بشركة IBM، غير المدرجة في .java.base
jdk.compilerيحدد التنفيذ الداخلي لمترجم جافا وأداة سطر الأوامر javac .
jdk.crypto.cryptokiيحدد هذا القسم كيفية تنفيذ موفر الأمان SunPKCS11 للعمليات التشفيرية.
jdk.dynalinkيحدد واجهة برمجة التطبيقات (API) لربط العمليات عالية المستوى على الكائنات بشكل ديناميكي.
jdk.editpadينفذ خدمة لوحة التحرير المستخدمة jdk.jshellلتقييم التعليمات البرمجية.
jdk.hotspot.agentيوفر هذا البرنامج آلية تنفيذ وكيل خدمة نقاط الاتصال الساخنة .
jdk.httpserverيحدد واجهة برمجة تطبيقات خادم HTTP الخاصة بـ JDK وأداة jwebserver لتشغيل خادم HTTP بسيط.
jdk.incubator.vectorيحدد واجهة برمجة التطبيقات للتعبير عن العمليات الحسابية التي يمكن تجميعها في تعليمات SIMD في وقت التشغيل، مثل تعليمات AVX أو NEON.
jdk.jartoolيوفر أدوات لمعالجة ملفات Java Archive (JAR)، مثل أوامر jar و jarsigner .
jdk.javadocيحدد هذا الملف تنفيذ أداة توثيق النظام وإصدار سطر الأوامر الخاص بها، javadoc .
jdk.jcmdيحدد أدوات تشخيص واستكشاف أخطاء عمليات JVM وإصلاحها، بما في ذلك jcmd و jps و jstat .
jdk.jconsoleيحدد هذا البرنامج أداة jconsole الرسومية القائمة على JMX لمراقبة وإدارة تطبيقات Java.
jdk.jdepsيحدد أدوات لتحليل التبعيات في برامج ومكتبات جافا، مثل jdeps و javap و jdeprscan و jnativescan .
jdk.jdiيحدد واجهة تصحيح أخطاء جافا (JDI) لتصحيح أخطاء تطبيقات جافا.
jdk.jdwp.agentيوفر تطبيقًا لوكيل بروتوكول تصحيح الأخطاء السلكية في جافا (JDWP) لتصحيح الأخطاء عن بعد.
jdk.jfrيحدد واجهة برمجة التطبيقات (API) لبرنامج JDK Flight Recorder (JFR) لجمع بيانات الأداء والتشخيص.
jdk.jlinkيحدد أداة jlink لإنشاء صور وقت التشغيل المخصصة، وأدوات jmod و jimage لإدارة ملفات JMOD و JDK للحاويات.
jdk.jpackageيحدد أداة تجميع Java ( jpackage ) لإنشاء حزم تطبيقات خاصة بالمنصة.
jdk.jshellيوفر أداة jshell لتقييم مقتطفات كود Java بشكل تفاعلي.
jdk.jsobjectيحدد واجهة برمجة التطبيقات (API) لدمج كائنات جافا سكريبت في تطبيقات جافا.
jdk.jstatdيُعرّف أداة jstatd لمراقبة إحصائيات JVM عن بُعد.
jdk.localedataيوفر بيانات خاصة بالمواقع الجغرافية خارج الولايات المتحدة.
jdk.managementيحدد واجهات إدارة خاصة بـ JDK لمراقبة JVM والتحكم فيه.
jdk.management.agentيُعرّف هذا الأمر وكيل الإدارة القائم على JMX لـ JVM.
jdk.management.jfrيحدد واجهة إدارة مسجل رحلات JDK (JFR).
jdk.naming.dnsينفذ موفر تسمية جافا لنظام أسماء النطاقات لحل أسماء النطاقات.
jdk.naming.rmiينفذ موفر تسمية RMI Java لاستدعاء الأساليب عن بعد.
jdk.netيحدد واجهة برمجة التطبيقات الخاصة بـ JDK لبرمجة الشبكات.
jdk.nio.mapmodeيحدد أوضاع تعيين الملفات المحددة المتوفرة في JDK.
jdk.sctpيوفر واجهة برمجة التطبيقات لبروتوكول نقل التحكم في التدفق (SCTP) في JDK.
jdk.security.authيقوم بتنفيذ وحدات المصادقة والواجهات المتعلقة بالأمان داخل javax.security.authالحزمة (الواجهات في javax.security.auth.*).
jdk.security.jgssيحدد هذا القسم امتدادات GSS-API وتنفيذ آلية SASL GSSAPI في JDK.
jdk.xml.domيُعرّف هذا الجزء من JDK مجموعة فرعية من واجهة برمجة تطبيقات نموذج كائن المستند (DOM) التابعة لاتحاد شبكة الويب العالمية (W3C) والتي لا يغطيها Java SE. ويُصدّر الحزم خارج نطاق الاسم (من ).javaorg.w3c.dom
jdk.zipfsيوفر هذا البرنامج تطبيقًا لموفر نظام ملفات ZIP، مما يتيح الوصول إلى ملفات ZIP كأنظمة ملفات.

الوحدة jdk.unsupportedليست وحدة رسمية، ولكنها غالبًا ما تكون مضمنة مع JDK، وتمثل تفاصيل التنفيذ في مكتبة Java القياسية . [ 18 ] تحتوي على حزم في مساحة الاسم sun.*(التي تحتوي على sun.misc.Unsafeالفئة، المستخدمة لمعالجة وحدة المعالجة المركزية والأجهزة، وإدارة الذاكرة مباشرة، وأشياء أخرى) [ 19 ] وحزم com.sun.*.

وحدة jdk.unsupported { تصدير sun.misc ؛ تصدير sun.reflect ؛ تصدير com.sun.nio.file ؛يفتح sun.misc ؛ يفتح sun.reflect ؛ }

Jakarta EE ، التي كانت سابقًا جزءًا من مكتبة Java القياسية، ليست معيارية، ومع ذلك يمكن لأنظمة البناء إنشاء وحدات نمطية تلقائية لها.

وحدات JavaFX

كانت JavaFX تُدمج سابقًا مع JDK الأساسي، حتى إصدار Java 11 عندما تم فصلها إلى OpenJFX. تنقسم JavaFX إلى الوحدات النمطية التالية. [ 20 ]

اسموصف
javafx.baseيحدد واجهات برمجة التطبيقات الأساسية لمجموعة أدوات واجهة المستخدم JavaFX (مثل واجهات برمجة التطبيقات للربط والخصائص والمجموعات والأحداث).
javafx.controlsيحدد هذا القسم واجهات برمجة التطبيقات (APIs) لعناصر التحكم في واجهة المستخدم، والرسوم البيانية، والقوالب في مجموعة أدوات واجهة المستخدم JavaFX.
javafx.fxmlيحدد هذا القسم واجهات برمجة تطبيقات FXML في مجموعة أدوات واجهة المستخدم JavaFX.
javafx.graphicsيحدد مخطط المشهد، والرسوم المتحركة، والهندسة، وواجهات برمجة التطبيقات الأخرى ذات الصلة لمجموعة أدوات واجهة المستخدم JavaFX.
javafx.mediaيحدد هذا الملف واجهات برمجة تطبيقات تشغيل الوسائط ومحتوى الصوت لمجموعة أدوات واجهة المستخدم JavaFX.
javafx.swingيحدد هذا القسم واجهات برمجة التطبيقات (APIs) الخاصة بدعم التوافق بين JavaFX و Swing لمجموعة أدوات واجهة المستخدم JavaFX.
javafx.webيحدد واجهات برمجة تطبيقات WebView لمجموعة أدوات واجهة المستخدم JavaFX.
jdk.jsobjectيُعرّف واجهات برمجة التطبيقات (APIs) لكائنات جافا سكريبت .
jfx.incubator.inputآلية حاضنة لتخصيص عناصر تحكم JavaFX.
jfx.incubator.richtextيحتضن عنصر تحكم RichTextArea لـ JavaFX.

لا يهدف نظام وحدات جافا إلى دعم جميع الوظائف التي تدعمها منصة OSGi حاليًا (مثل نموذج دورة الحياة وسجل الخدمات). مع ذلك، سيدعم نظام وحدات جافا وظائف لا تدعمها OSGi، مثل نمطية وقت الترجمة، والدعم المدمج للمكتبات الأصلية. [ 21 ] نُشرت مقالتان في عام 2016 تستكشفان كيفية تفاعل نظام وحدات جافا مع OSGi. يمكن الاطلاع عليهما على موقع InfoQ [ 22 ] ومدونة تحالف OSGi. [ 23 ]

انظر أيضاً

مراجع

  1. "نظام وحدات منصة جافا (JSR 376)" . شركة أوراكل . تم الاطلاع عليه بتاريخ 2018-07-02 .
  2. 1 2 "مشروع جيغسو" . شركة أوراكل . تم الاسترجاع في 29-11-2015 .
  3. مارك راينهولد (20 سبتمبر 2009). "حان وقت... الخطة البديلة" . شركة أوراكل . تم الاطلاع عليه بتاريخ 21 يونيو 2017 .
  4. "JDK 9" . شركة أوراكل . تم الاطلاع عليه بتاريخ 24-02-2016 .
  5. "فهم وحدات جافا 9: ماهيتها وكيفية استخدامها" . شركة أوراكل. مؤرشف من الأصل بتاريخ 14 أغسطس 2022. تم الاطلاع عليه بتاريخ 8 ديسمبر 2025 .
  6. "جافا 9: تاريخ الإصدار والميزات الجديدة" . techworld.com. 21-07-2017 . تم الاطلاع عليه بتاريخ 18-11-2017 .
  7. "jlink: رابط جافا (JSR 282)" . شركة أوراكل . تم الاطلاع عليه بتاريخ 12 مارس 2016 .
  8. "نظام وحدات منصة جافا (JSR 376)" . شركة أوراكل . تم الاطلاع عليه بتاريخ 29-11-2015 .
  9. "JEP 238: ملفات JAR متعددة الإصدارات" . شركة أوراكل . تم الاطلاع عليه بتاريخ 31 يوليو 2017 .
  10. "JEP 253: إعداد عناصر تحكم واجهة المستخدم JavaFX وواجهات برمجة تطبيقات CSS للنمذجة المعيارية" . شركة أوراكل . تم الاطلاع عليه بتاريخ 31 يوليو 2017 .
  11. "JEP 260: تغليف معظم واجهات برمجة التطبيقات الداخلية" . شركة أوراكل . تم الاطلاع عليه بتاريخ 31 يوليو 2017 .
  12. "JEP 275: تغليف تطبيقات جافا المعيارية" . شركة أوراكل . تم الاطلاع عليه بتاريخ 31 يوليو 2017 .
  13. مارك راينهولد (2016-03-08). "حالة نظام الوحدات النمطية" . شركة أوراكل . تم الاطلاع عليه بتاريخ 2017-02-18 .
  14. "JEP 396: تغليف مكونات JDK الداخلية بشكل قوي افتراضياً" . تم الاطلاع عليه بتاريخ 2021-02-06 .
  15. "ملخص وحدة JDK" . شركة أوراكل . 24-06-2016. مؤرشف من الأصل بتاريخ 08-12-2015 . تم الاطلاع عليه بتاريخ 18-02-2017 .
  16. "JEP 494: إعلانات استيراد الوحدات (معاينة ثانية)" . openjdk.org .
  17. "مواصفات واجهة برمجة تطبيقات Java® Platform، الإصدار القياسي ومجموعة تطوير Java الإصدار 24" . docs.oracle.com .
  18. "jdk.unsupported" . cr.openjdk.org . OpenJDK . تم الاطلاع عليه بتاريخ 10 أكتوبر 2025 .
  19. بن إيفانز (4 مايو 2020). "الفئة غير الآمنة: غير آمنة بأي سرعة" . blogs.oracle.com . شركة أوراكل.
  20. "نظرة عامة (JavaFX)" . openjfx.io .
  21. مارك راينهولد (24 أغسطس 2012). "مشروع جيغسو: متأخر عن القطار: الأسئلة والأجوبة" . شركة أوراكل . تم الاطلاع عليه بتاريخ 29 نوفمبر 2015 .
  22. "جافا 9، وOSGi، ومستقبل النمطية" . InfoQ . تم الاطلاع عليه بتاريخ 26-09-2016 .
  23. "طبقات وحدات جافا وحزم OSGi" . تحالف OSGi . تم الاسترجاع في 1 أغسطس 2016 .