مدخل إلى جافا بيئات البرمجة (programming environment) في جافا


رضوى العربي

تُعدّ لغة الجافا لغة قياسية ومعيارية إلى حد بعيد، ومع ذلك، تختلف الإجراءات اللازمة لإنشاء برامج الجافا وتَصْرِيفها وتَعْدِيلها من بيئة برمجة (programming environment) إلى آخرى اختلافًا كبيرًا. تَتَوفَّر طريقتان في العموم هما: بيئة سطر الأوامر (command line environment) حيث يَكْتُب المُستخدِم أوامرًا (commands) يَرُد عليها الحاسوب، والآخرى هي بيئة تَطْوِير مُتكاملة (integrated development environment - IDE) والتي يَعتمِد فيها المُستخدِم على كُلًا من الفأرة ولوحة المفاتيح للتَفاعُل مع واجهة مُستخدِم رُسومية (graphical user interface). في حين تَتَوفَّر بيئة سطر أوامر واحدة للغة الجافا، فهنالك الكثير من بيئات التَطْوِير المُتكاملة منها Eclipse و NetBeans و IntelliJ IDEA و BlueJ. سنتناول خلال هذا القسم المعلومات الضرورية لكي تَتَمكَّن من تَصْرِيف (compile) الأمثلة وتَشْغِيلها باِستخدَام كُلًا من سطر الأوامر وبيئتي Eclipse و BlueJ. اِحرِص دائمًا على قراءة الأمثلة وتَصْريِفها وتَشْغِيلها. ستَجِد الشيفرة المصدرية لكُلًا من البرامج التوضيحية وحلول تمارين كل فصل بموقع الكتاب الالكتروني.

يُعدّ الإصدار ١٤ هو الإصدار الحالي من الجافا، ولكن سيَعتمِد الكتاب على الإصدار ٨. في الحقيقة، لقد حَدَثَت الكثير من التَعْدِيلات على لغة الجافا وكذلك سياسة شركة أوراكل (Oracle) منذ الإصدار ٨. أدت تلك التَغْيِيرات إلى جَعْل مُهِمّة تَثْبِيت الجافا وتَجهِيزها للعمل أكثر صعوبة، ولذلك سنُحاوِل شرح المعلومات الضرورية لتَثْبِيتها بهذا القسم.

أصبحت الإصدارات الجديدة من الجافا تُصدَر بصورة أسرع مما كانت عليه في الماضي. يُعدّ بعضها إصدارات مُدعَّمة طويلة الأمد (long-term support - LTS) أي تَستمِر بتَلَقِّي التحديثات الأمنية (security updates) وتحديثات إصلاح الأخطاء البرمجية (bug fixes) لفترة أطول من الزمن. يُعدّ الإصدارين ٨ و ١١ من الجافا من الإصدارات المُدعَّمة طويلة الأمد أما الإصدارات ٩ و ١٠ و ١٢ و ١٣ و ١٤ فليست كذلك. في الواقع، الإصدارات ٨ و ١١ و ١٤ هي إصدارات مُدعَّمة رسميًا إلى الآن.

عدة تطوير جافا JDK و JavaFX

يُعرَف نظام التطوير بلغة الجافا باسم "عُدة تطوير جافا (Java Development Kit - JDK)". تَعتمِد الأمثلة بهذا الكتاب على الإصدار ٨ من الجافا أو الإصدارات الأحدث، لذا ينبغي أن تُثبته على حاسوبك. تَتَوفَّر الجافا بنسختين: عُدة تَطوِير (JDK) وبيئة تّنْفيذ (Java Runtime Environment - JRE). تُستخدَم نسخة بيئة التّنفيذ (JRE) لتَشغِيل البرامج، لكن ليس بإمكانها تَصْرِيفها (compile). في المقابل، يُمكِنك اِستخدَام نسخة عُدة التطوير (JDK) لتَصرِيف البرامج كما أنها تَتَضمَّن بيئة تّنْفيذ (JRE). لقد أصبح من الصعب إيجاد ملف بيئة تّنْفيذ مُنفصِل منذ الإصدار ١١ من الجافا ولكن ما يزال ذلك المُصطلح مُستخدَمًا على أية حال. تَتَضمَّن عُدة تطوير جافا (JDK) بيئة لسطر الأوامر (command line environment) ستحتاج إليها للعمل مع الجافا. لاحظ أنه لابُدّ من أن تُحمِّل عدة تطوير جافا (JDK) حتى لو كنت تنوي اِستخدَام بيئة تطوير متكاملة (IDE).

طُوِّرت لغة الجافا بواسطة شركة صن ميكروسيستمز (Sun Microsystems) ثم اِستحوَذت عليها مؤسسة أوراكل (Oracle). يُمكِنك أن تُحمِّل نسخة أوراكل من عُدة تَطوِير جافا (JDK) من موقعها الإلكتروني مباشرةً، ولكنها أصبحت منذ الإصدار الحادي عشر تَستهدِف الأغراض التجارية لذا ربما قد تُفضِّل الاعتماد على نسخة OpenJDK فيما يتعلق بالأغراض الشخصية والتعليمية، فهي تمتلك نفس وظائف نسخة أوراكل كما أنها مُوزعة برخصة مجانية ومفتوحة المصدر (open-source). يَفترِض ما يلي اِستخدَامك لنسخة OpenJDK، فإذا كنت قد حمَّلت نسخة أوراكل، ستَجِد تَعْليمَات التثبيت بموقعها الإلكتروني.

يُمكِنك أن تُحمِّل نسخة OpenJDK من موقع https://jdk.java.net التابع لأوراكل ولكنه يُوفِّر خيارات محدودة، لذا قد تُفضِّل تَحْمِيله من موقع AdoptOpenJDK حيث يُوفِّر نُسخًا لنطاق أوسع من المنصات كما أنه يُوفِّر أداة تثبيت للجافا لنظامي ماك (Mac) وويندوز (Windows) مما يُسهِل من عملية التثبيت على تلك المنصات لذا فقد يَكُون ذلك هو خيارك الأفضل لتثبيت JDK. أما بالنسبة لنظام لينكس (Linux)، فعادةً ما تستطيع تثبيت JDK من مستودع برمجيات (software repositories) النظام. لاحِظ أنه على الرغم من أن كُلًا من البرامج التوضيحية والتمارين التي سنتناولها هنا مُتناسبة مع الإصدارات الأقدم من JDK حتى الإصدار الثامن، لكن يُنصَح عمومًا بالاعتماد على أحدث إصدار منه أو على إصدار مُدعم على المدى البعيد. منذ مايو ٢٠٢٠، يُعدّ الإصدار الحالي للجافا هو ١٤.

تَعتمِد تطبيقات واجهة المُستخدِم الرسومية (GUI programs) على مكتبة برمجية تُعرَف باسم JavaFX. إذا كنت تَستخدِم أداة OpenJDK، فينبغي عليك أن تُحمِّل تلك المكتبة بصورة مُنفصلة عن الأداة. أما بالنسبة لنُسخ أوراكل من أداة JDK، فلقد كانت مكتبة JavaFX مُضْمَّنة بها حتى الإصدار الحادي عشر من الجافا أي إذا كنت تَستخدِم إصدارًا أحدث، سينبغي عليك تَحْمِيلها أيضًا بصورة مُنفصِلة. تستطيع عمومًا تَحْمِيل مكتبة JavaFX من هنا.

ملحوظة: ينبغي أن تَكُون عُدة تطوير جافا إف إكس (JavaFX SDK) مُتناسبة مع نظام التَشغِيل الخاص بك (لينكس، وماك، وويندوز) كما ينبغي أن تَكُون مُتوافقة مع إصدار أداة OpenJDK الذي تَستخدِمه.

إذا كنت قد حَمَّلت أداة تثبيت JDK لنظام ويندوز (Windows) أو ماك (Mac) من موقع أوراكل (Oracle) أو موقع AdoptOpenJDK، فتستطيع ببساطة أن تَنقُر نقرة مزدوجة على ملف أداة التثبيت إذا لم يَكُن قد شُغِّل أتوماتيكيًا بالفعل لبدء عملية التثبيت أما إذا كنت قد حَمَّلت ملفات OpenJDK و JavaFX، فستَجِد كُلًا منهما بهيئة ملف أرشيفي (archive file) مَضغُوط ينبغي أن تَستخرِج محتوياته أولًا. يُمكِنك أن تَنقُر على أيقونة الملف الأرشيفي نقرة مُزدوجة مما سيُؤدي إلى اِستخرَاج محتوياته أو فَتْح برنامج يُساعِدك على اِستخرَاج محتوياته. ستَجِد بَعْدها مُجلدًا يحمل اسم مشابه لـ"jdk-11.0.7" أو "javafx-sdk-11.0.2"، والذي تستطيع وَضْعُه بأي مكان بالحاسوب ولكن ينبغي أن تَعرِف مساره.

إذا كنت تَستخدِم نظام لينكس (Linux)، فعادةً ما يُوفِّر مستودع برمجيات (software repositories) لينكس إصدارًا حديثًا من كُلًا من OpenJDK و JavaFX مما سيُمكِّنك من تثبيتهما باِستخدَام أداة تثبيت البرمجيات (Linux software installer). يعَتمِد ذلك على إصدار لينكس المُستخدَم لكن في العموم يُمكِنك البحث عن أي حزم (packages) تَحتوِي أسمائها على كلمات مثل "openjdk" و "openjfx" كما أنك ستحتاج أيضًا إلى مَعرِفة مكان مجلد عدة تطوير JavaFX الذي يَقَع عادةً بالمسار "‎/usr/share/openjfx".

إذا كُنت تَستخدِم نظام ماك (Mac) وحَمَّلت OpenJDK كملف أرشيفي، فينبغي أن تَستخرِج محتوياته، وستَجِد عندها مُجلدًا اسمه هو "jdk-11.0.7.jdk". يُنصَح بنَقْل مجلد JDK إلى المسار "‎/Library/Java/JavaVirtualMachines" وهو ما يَتَطلَّب بعض الصلاحيات الإدارية. يَعتمِد نظام ماك (Mac) بشكل تلقائي على أحدث إصدار من JDK بالمسار "‎Library/Java/JavaVirtualMachines/".

أما إذا كنت تَستخدِم نظام ويندوز (Windows)، فعادةً ما تُثبَّت عُدة تطوير جافا (JDK) بالمسار "C:\Program Files\Java" لذلك يُمكِنك نَقْل مجلد OpenJDK إلى نفس ذلك المسار.

بيئة سطر الأوامر

تَختلِف بيئة سطر الأوامر (command line environment) عن واجهات المُستخدِم الرُسومية (graphical user interfaces) إلى حد كبير. في حين أن غالبية مُستخدمِي الحواسيب العصرية مُعتادون على الواجهات الرُسومية حيث يَجِدُون بيئة سطر الأوامر غَيْر بديهية، ولكن يُمكِنك بقليلٍ من المُمارسة أن تَتَعلَّم أساسيات بيئة سطر الأوامر وستَجِدها أكثر إنتاجية بالموازنة مع نظيرتها من الواجهات الرُسومية. في العموم، يُعدّ تَعلُّم كيفية اِستخدَام سطر الأوامر (command line) أمرًا مهمًا بالأخص لطلبة علوم الحاسوب (computer science)، ولكن يُمكِنك تَخطِّيه إن كُنت تَنوِي الاِعتمَاد بالكامل على واحدة من بيئات التطوير المتكاملة (IDE).

ينبغي أن تَفتَح نافذة كتابة الأوامر أولًا لكي تَتَمكَّن من اِستخدَام بيئة سطر الأوامر (command line environment). إذا كنت تَستخدِم نظام ويندوز (Windows)، فيُمكِنك فَتْح تلك النافذة عن طريق تَشْغِيل برنامج اسمه "cmd" أما إذا كنت تَستخدِم نظام ماك (Mac)، فيُمكِنك تَشْغِيل برنامج الطرفية (terminal) والذي ستَجِده بمُجلد الأدوات (Utilities) داخل مُجلد التطبيقات (applications) أما إذا كنت تَستخدِم نظام لينكس (Linux)، فهنالك أكثر من طريقة، فيُمكِنك مثلًا أن تَستخدِم برنامجًا اسمه "xterm" لكن حَاوِل البحث عن برنامج الطرفية (terminal) بقائمة التطبيقات (applications) أولًا.

عند فَتْح نافذة الأوامر (command window) بأي حاسوب، سيَظهَر محث (prompt) حيث تستطيع أن تَكْتُب أمرًا (command) ثم تَضغَط على مفتاح العودة الى بداية السطر. سيُنفِّذ الحاسوب عندها ذلك الأمر ثم سيَعرِض الخرج (output) الناتج عن الأمر بنفس النافذة. سيَظهَر بَعْدها المحث مرة آخرى لكي يُمكِّنك من كتابة أمر جديد. يُعدّ "المجلد الحالي (current directory)" أو "مجلد العمل (working directory)" واحدًا من المفاهيم الأساسية ببيئة سطر الأوامر (command line environment)، وعادةً ما يَكُون اسم المجلد الحالي جزءًا من اسم محث الأوامر (command prompt). (لاحِظ أن الكلمتين "directory" أو "folder" يحملان نفس المعنى). يَحتوِي المجلد الحالي (current directory) على ملفات تُستخدَم مِن قِبَل الأوامر المُدْخَلة. إذا كنت تَستخدِم نظام ويندوز، يُمكِنك اِستخدَام الأمر dir لتَحصُل على قائمة بالملفات الموجودة بالمجلد الحالي أما إذا كنت تَستخدِم نظام لينكس أو ماك، فيُمكِنك اِستخدِم الأمر ls لنفس الغرض. عند فَتْح النافذة للمرة الأولى، ستَجِد أن المُجلد الحالي يُشير إلى المجلد الرئيسي للمُستخدِم (home directory) أي حيث ملفاته الشخصية مُخزَّنة. يُمكِنك أن تُغيِّر المجلد الحالي باِستخدَام الأمر cd متبوعًا باسم المُجلد الذي تود أن تَستخدِمه. فمثلًا إذا كان المجلد الحالي يُشير إلى مجلدك الرئيسي (home directory)، يُمكِنك أن تَكْتُب الأمر cd Desktop لكي تُغيِّره إلى مُجلد سطح المكتب (Desktop directory) الخاص بك وبالطبع ينبغي أن تَضغَط على مفتاح العودة إلى بداية السطر لكي يُنفَّذ الأمر.

يُمكِنك أن تُنشِئ مجلدًا (directory/folder) بمُجلدك الرئيسي (home directory) لتَخْزِين برامج الجافا الخاصة بك، وليَكُن اسم المجلد هو "javawork". تستطيع بالطبع أن تُنشِئه باِستخدَام الواجهة الرسومية، ولكننا سنُنشِئه هنا باِستخدَام سطر الأوامر (command line). اِتبع الخطوات التالية ببساطة: أولًا، اِفتح نافذة الأوامر (command window). إذا كُنت تريد أن تُنشِئه بمجلد آخر غَيْر مُجلدك الرئيسي (home directory)، فينبغي أن تَستخدِم الأمر cd -كما أوضحنا مُسبَقًا- للانتقال إلى ذلك المجلد. بَعد ذلك، يُمكِنك أن تَكْتُب الأمر mkdir javawork لكي تُنشِئ المجلد الجديد. وقتما تريد العمل على أحد برامج الجافا الخاصة بك ضِمْن ذلك المجلد، تستطيع فَتْح نافذة الأوامر (command window) وكتابة الأمر cd للانتقال إلى المجلد "javawork".

يُعدّ الأمرين javac و java من أبسط الأوامر لاِستخدَام الجافا من خلال سطر الأوامر. يُستخدَم الأمر javac لتَصرِيف (compile) الشيفرة المصدرية المَكْتُوبة بلغة الجافا بينما يُستخدَم الأمر java لتَشْغِيل البرامج. تَقَع تلك الأوامر بمجلد اسمه "bin" داخل مجلد عُدة تطوير جافا (JDK). إذا ثَبَّت كل شيء بصورة سليمة، فينبغي أن يتعرَّف الحاسوب على هذه الأوامر عند كتابتها بسطر الأوامر (command line). حَاوِل مثلًا أن تَكْتُب كُلًا من الأمرين java -version و javac -version بسطر الأوامر. إذا كان كل شيء مُثبَّتًا على نحو سليم، فستَعرِض تلك الأوامر إصدار الجافا المُثبَّت أما إذا كان هنالك مشكلة ما، فستَحصُل على رسالة مثل "الأمر غَيْر موجود".

بالنسبة لنظام لينكس، إذا كنت قد ثَبَّت الجافا من مستودع برمجيات النظام (software repositories)، فينبغي أن يَكون كل شيء مَضبُوطًا على نحوٍ سليم. يَنطبِق الأمر نفسه على نظام ماك إذا كنت قد اِستخدَمت أداة التثبيت من موقع AdoptOpenJDK أو إذا كنت قد نَقْلَت مجلد OpenJDK إلى المسار "/Library/Java/JavaVirtualMachines/". يَعتمِد الأمرين javac و java بنظام ماك على أحدث إصدار من عدة تطوير جافا (JDK) ضِمْن ذلك المجلد. بالنسبة لنظام ويندوز، إذا كنت قد اِستخدَمت أداة تثبيت AdoptOpenJDK، فينبغي أن يَكُون كل شيء مضبوطًا بصورة افتراضية. في المقابل، إذا كنت قد اِستخدَمت نُسخة أوراكل من عُدة تطوير جافا (Oracle JDK) أو ملف JDK مضغُوط، فلابُدّ أن تُضيف مسار مجلد "bin" الموجود بمجلد عُدة تطوير جافا (JDK) يدويًا إلى مسار النظام (system path). تُوضِح تَعْليمَات تثبيت نسخة أوراكل بنظام ويندوز طريقة القيام بذلك. اُنظر تحديدًا قسم "ضَبْط مُتْغيِّر البيئة PATH" بتَعْليمَات تثبيت JDK بنظام ويندوز.

سنُجرِّب الآن الأمر javac، يُمكِنك أن تَضَع مثلًا نُسخة من الملف HelloWorld.java بمجلد العمل (working directory). إذا كنت قد حمَّلت نسخة الكتاب المُتاحة عبر الإنترنت، ستَجِد ذلك الملف بالمجلد "source". تستطيع أن تَستخدِم الواجهة الرسومية لنَسْخ ذلك الملف ولصقه إلى مجلد العمل. أو على نحوٍ بديل، يُمكِنك فَتْح ذلك الملف بالموقع الإلكتروني للكتاب واِستخدَام أمر المُتصفح "Save As" لحِفظ نسخة منه بمُجلد العمل الخاص بك. اُكْتب الآن الأمر التالي:

javac  HelloWorld.java

سيُصرِّف ذلك الأمر الملف HelloWorld.java وسيُنشِئ ملف بايتكود اسمه HelloWorld.class بنفس المجلد. إذا نجح الأمر في عملية التصريف، لن تَحصُل على أي خَرْج، وسيَظهَر محث الأوامر (command prompt) مرة آخرى ليُخبرك بكَوْنه جاهزًا لاستقبال أي أمر آخر. يُمكِنك عندها كتابة الأمر java لتَشْغِيل البرنامج كالتالي:

java  HelloWorld

ينبغي أن يَعرِض الحاسوب الرسالة "Hello World!‎". على الرغم من أن البرنامج مُخزَّن بالملف HelloWorld.class، يَستخدِم الأمر java اسم الصَنْف (class) -أي HelloWorld- لا اسم الملف.

تَستخدِم الكثير من البرامج التوضيحية التي سنتعرض لها الصنف TextIO لقراءة مدخلات المُستخدِم (اُنظر القسم الفرعي ٢.٤.٣). ولأن الصنف TextIO ليس جزءًا قياسيًا من لغة الجافا، لابُدّ إذًا من أن تتيحه لأي برنامج يَستخدِمه. يَعنِي ذلك أن مجلد العمل (working directory) الخاص بك ينبغي أن يحتوي على مجلد اسمه "textio" بداخله ملف اسمه TextIO.java، والذي يُمكِنك نسخه من المجلد "source" أو تحميله من الموقع الالكتروني، ولكن تَأكَّد من وَضْعه داخل مجلد اسمه "textio" بنفس مجلد البرنامج الذي يَستخدِم الصَنْف TextIO.

يُمكِنك الآن أن تُشغِّل البرنامج التوضيحي Interest2.java لتختبر مُدْخَلات البرنامج. اِستخدِم الأمر التالي أولًا لتَصرِيف (compile) البرنامج:

javac  Interest2.java

إذا نجح الأمر السابق، فإنه سيُنشِئ ملفًا مُصرَّفًا (compiled) اسمه Interest2.class، وكذلك سيُنشِئ ملفًا اسمه TextIO.class بالمجلد "textio" إذا لم يَكُن موجودًا. في العموم، لا يُصرِّف الأمر javac الملف المُخصَّص فقط وإنما يُصرِّف أيضًا أية ملفات جافا آخرى مطلوبة. تستطيع الآن تَشْغِيل البرنامج بكتابة الأمر التالي:

java  Interest2

سيَطلُب البرنامج منك أن تُدْخِل بعض المعلومات لذا ينبغي أن تَكْتُب إجاباتك بنافذة الأوامر (command window) مع الضَغْط على محرف العودة بنهاية كل سطر. عندما ينتهي البرنامج، سيَظهَر محث الأوامر (command prompt) مرة آخرى مما يَعنِي إمكانية كتابة أمر جديد. لأن الصَنْف TextIO لا يُعرِّف البرنامج main()‎، لا يُمكِن تّنْفيذه كبرنامج أي لا يَكُون للأمر java TextIO أي معنى.

يُمكِنك تَشْغِيل جميع البرامج التي سنَتعرَّض لها هنا بنفس الطريقة باستثناء تلك التي تَستخدِم مكتبة JavaFX والتي سنُوضِح طريقة تَشْغِيلها بالقسم الفرعي التالي.

ستحتاج إلى مُحرر نصي (text editor) لتُنشِئ برامجك الخاصة. سيَسمَح لك أي مُحرر نصي في العموم بكتابة مستندات (documents) تَحتوِي على نص مُجرّد (plain text) ومن ثَمَّ حِفظها. لابُدّ أن تَحفظ تلك المُستندات كنص مُجرّد بدون أي ترميز (encoding) أو تنسيق خاص. في المقابل، لا يُمكِنك أن تَستخدِم مُعالجات النصوص (Word processor) إلا إذا ضَبْطتها لكي تحفظ المستندات بهيئة نص مُجرّد (plain text). سيُمكِّنك أي محرر نصي جيد من البرمجة على نحو أفضل. يأتي نظام لينكس مثلًا مع مجموعة من محررات النصوص (text editors). أما بالنسبة لنظام ويندوز، فيُمكِنك أن تَستخدِم برنامج notepad أو قد تبحث عن شيء أفضل قليلًا. بالنسبة لنظام ماك، يُمكِنك أن تُحمِّل تطبيق BBEdit مجانًا. بالإضافة إلى تلك البرامج، قد تُفضِّل استخدام برامج متعددة المنصات (cross-platform) مثل المحرر النصي jedit أو مُحرر البرمجة الشائع Atom.

يُمكِنك الآن أن تَكْتُب برنامجًا خاصًا بك باتباع الخطوات التالية: اِفتح نافذة سطر الأوامر (command line window) ثم استخدِم الأمر cd لكي تنتقل إلى مجلد العمل (working directory) حيث تُخزِّن ملفات الشيفرة المصدرية (source code). اُنقُر نقرة مزدوجة على أيقونة برنامج مُحرر النصوص (text editor) أو اختره من قائمة "ابدأ (Start)" لتَشْغِيله ثم اُكْتُب شيفرة البرنامج بنافذة المُحرر أو قد تُعدِّل على ملف شيفرة مصدرية موجود مُسْبَقًا، وأخيرًا اِحفظ الملف. يَحمِل أي ملف شيفرة مصدرية بلغة الجافا اسمًا يَتطابَق مع اسم الصَنْف (class) المُعرَّف بالملف وينتهي بالامتداد ‎.java. بَعْد حِفظ الملف بمجلد العمل (working directory)، اِستخدِم الأمر javac لتَصْرِيف (compile) الملف كما ذَكَرنا مُسْبَقًا. إذا كان هنالك أية أخطاء بقواعد بناء الجملة (syntax errors) بشيفرة البرنامج، ستَظهَر رسائل خطأ بنافذة الأوامر (command window). ستُخبرك كل رسالة منها برقم سطر ضِمْن ملف حيث عَثَر الحاسوب على الخطأ. ينبغي إذًا أن تعود مرة آخرى إلى المُحرر لتَصْليح ذلك الخطأ، وبعدها ينبغي أن تَحفظ تلك التَغْيِيرات وتُجرِّب الأمر javac مُجددًا. يُفضل دومًا أن تُحاول إصلاح أول مجموعة صغيرة من رسائل الأخطاء، فعادةً ما يؤدي تَصْلِيحها إلى اختفاء بعض الأخطاء الآخرى. عندنا ينجح الأمر javac بعملية التَصرِيف، لن تَحصُل على أية رسائل نهائيًا أو قد تَحصُل على بعض "التحذيرات (warnings)" التي لا تَمنَع تَشْغِيل البرنامج. يُمكِنك الآن أن تَستخدِم الأمر java لتَشْغِيل البرنامج كما ذَكَرنا مُسْبَقًا. بمُجرّد تَصرِيف البرنامج، يُمكِنك أن تُشغِّله وقتما تُريد وبأي عدد من المرات دون الحاجة لإعادة تَصرِيفه (compile).

ها هو مُلخَّص كل شيء تقريبًا: ابقي كُلًا من نافذة المحرر ونافذة سطر الأوامر مفتوحة. عَدِّل محتويات الملف ثم اِحفظه وأخيرًا حَاوِل تَصْرِيفه (compile) إلى أن تَختفِي جميع أخطاء بناء الجملة (syntax errors). ينبغي دومًا أن تَحفظ التَغْيِيرات التي أَجْرَيتها على الملف قَبْل أن تُحاوِل إعادة تَصْرِيفه حيث يرى المُصرِّف (compiler) آخر نُسخة محفوظة من الملف وليس النُسخة المَعرُوضة بنافذة المُحرر. بَعْدما تُشغِّل البرنامج، قد تَعثُر على بعض الأخطاء الدلالية (semantic errors)، وعندها يَنبغِي أن تعود إلى حَلْقة "عَدِّل واِحفظ وصَرِّف" في محاولة للعُثور على المشكلة وإصلاحها.

استخدام JavaFX بسطر الأوامر

تَتَكوَّن مكتبة JavaFX من مجموعة من الأصناف (classes) المَكْتُوبة بلغة الجافا، والتي يُمكِنها أن تُستخدَم لإنشاء برامج واجهة مُستخدِم رُسومية (GUI). سنَتَعرَّض لتلك المكتبة بالقسم ٣.٩ للمرة الأولى، وسنتناولها تفصيليًا بكُلًا من الفصلين ٦ و ١٣. بالإضافة إلى ذلك، ستَجِدها مُستخدَمة ضِمْن الأمثلة التوضيحية بعدة فصول آخرى.

لقد كانت مكتبة JavaFX جزءًا قياسيًا من نسخة أوراكل من عُدة تطوير جافا (JDK) الإصدار ٨. إذا كنت قد ثَبَّت ذلك الإصدار، فأنت لست بحاجة للقيام بأي شيء آخر لاِستخدَامها. في المقابل، إذا كنت قد ثَبَّت OpenJDK أو JDK للإصدار ١١ أو أحدث، فينبغي عليك أن تُجْرِي عدة أشياء لأن مكتبة JavaFX أصبحت تُوزَّع منذ ذلك الإصدار كمجموعة من الوحدات (modules) بشكل مُستقِل. تُخزَّن الوحدات (modules) -كما سنُوضِح بالقسم الفرعي ٤.٦.٤- بهيئة ملفات ‎.jar بالمجلد الفرعي "lib" بمجلد عُدة تطوير جافا إف إكس (Java SDK). عندما تَستخدِم أي من الأمرين java أو javac مع برنامج يَعتمِد على مكتبة JavaFX، ينبغي أن تُمرِّر مسار وحدات مكتبة JavaFX إلى ذلك الأمر. سنُوضِح بهذا القسم كيفية اِستخدَام JavaFX بسطر الأوامر بالإصدار ١١ أو أحدث.

يُستخدَم الخياران ‎--module-path و ‎--add-modules لتَخْصِيص وحدات (modules) مكتبة JavaFX. يُخصِّص الخيار الأول المُجلد الذي يحتوي على ملفات ‎.jar أما الثاني فيُخصِّص الوحدات (modules) المُستخدَمة ضِمْن البرنامج بشكل فعليّ. يُمكِنك ضَبْط قيمة الخيار ‎--add-modules إلى القيمة "ALL-MODULE-PATH" مما سيُؤدي إلى إتاحة مكتبة JavaFX بالكامل أما الخيار ‎--module-path، فينبغي أن تَضبُطه إلى مسار المجلد "lib" الذي يَحتوِي على ملفات ‎.jar. لنَفترِض مثلًا أن اسم مجلد JavaFX هو "openjfx-sdk-11"، وبأنه موجود بالمجلد الرئيسي "‎/home/eck"، سيَكُون مسار المجلد "lib" هو "‎/home/eck/openjfx-sdk-11/lib" أي يُمكِننا عندها كتابة أمر javac التالي لتَصرِيف برامج JavaFX:

javac --module-path=/home/eck/openjfx-sdk-11/lib --add-modules=ALL-MODULE-PATH

ينبغي أن تُضيف إليه أسماء ملفات ‎.java التي تُريد أن تُصرِّفها. يَتَطلَّب الأمر java نفس تلك الخيارات ليُشغِّل برامج JavaFX. يُمكِنك أن تَستخدِم الاختصار ‎-p بدلًا من ‎--module-path كالتالي:

javac -p /home/eck/openjfx-sdk-11/lib --add-modules=ALL-MODULE-PATH

إذا لم تَستطِع مَعرِفة مسار عُدة تطوير جافا إف إكس (JavaFX SDK)، اِفتح نافذة الأوامر (command window) واستخدِم الأمر cd لكي تنتقل إلى مجلد "lib" الخاص بعُدة تطوير جافا إف إكس. إذا كنت تَستخدِم نظام ماك أو لينكس، فيُمكِنك أن تَكْتُب الأمر pwd لكي تَطبَع مسار مجلد العمل (working directory) أما إذا كنت تَستخدِم نظام ويندوز، اِستخدِم الأمر cd بدون تَخْصِيص أي مجلد لكي تَطبَع المسار. أخيرًا، اِستخدِم خَرْج ما سبَق كقيمة للخيار ‎--module-path. قد يبدو أمر java عند اِستخدَامه مع javafx كما يلي:

java -p C:\Users\eck\openjfx-sdk-11\lib --add-modules=ALL-MODULE-PATH

إذا اِحتوَى المسار على مسافة أو أي محارف خاصة آخرى، فلابُدّ أن تُحيطه بعلامتي اقتباس.

لأن الأمر بالأعلى طويلًا نوعًا ما، سيَكُون من الأفضل بالتأكيد لو أمَكْنَنا تَجنُّب إعادة كتابته بكل مرة نُنفِّذه فيها. إذا كنت تَستخدِم نظام لينكس أو ماك، يُمكِنك أن تُعرِّف اسمًا مستعارًا (alias) يَعمَل كاختصار لأمر معين. على سبيل المثال، يُمكِنك أن تُعرِّف الاسم المستعار jfxc كاختصار لأمر تَصرِيف البرامج المُستخدِمة لمكتبة JavaFX. لاحِظ أنه من الضروري اِستخدَام المسار الكامل لكُلًا من الأمر javac ومجلد "lib" الخاص بمكتبة JavaFX أثناء تعريف الاسم المستعار. سيبدو تَعرِيفه مشابهًا لما يلي (لابُدّ من كتابته ضِمْن سطر واحد):

alias jfxc='/home/eck/jdk-11.0.7/bin/javac 
                  --module-path=/home/eck/javafx-sdk-11/lib 
                  --add-modules=ALL-MODULE-PATH'

بالمثل، يُمكِنك أن تُعرِّف الاسم المستعار jfx كاختصار لأمر تَشْغِيل البرامج المُستخدِمة لمكتبة JavaFX:

alias jfx='/home/eck/jdk-11.0.7/bin/java 
                  --module-path=/home/eck/javafx-sdk-11/lib 
                  --add-modules=ALL-MODULE_PATH'

لابُدّ أن تُضيِف تَعرِيفات الأسماء المستعارة (aliases) بالأعلى إلى ملف ‎.bashrc بنظام لينكس وملف ‎.bash_profile بنظام ماك بمُجلد المُستخدِم الرئيسي (home directory) لكي تَحتفِظ بها بصورة دائمة. عادةً ما يَكون ذلك الملف موجودًا، وإذا لم تَجِده، فيُمكِنك أن تُنشئه ببساطة. يُنفَّذ ذلك الملف بكل مرة تُفْتَح فيها نافذة طرفية (terminal) أيّ لن تُفعَّل أية تَعْدِيلات تُجرِيها عليه حتى تَفتَح طرفية جديدة. يبدأ اسم الملف بنقطة (period) مما يَعنِي كَوْنه ملف مَخفِي (hidden file) لا يُعرَض افتراضيًا بمُتصفِح الملفات. إذا كنت تَستخدِم نظام لينكس، يُمكِنك أن تُظهِر أية ملفات مخفية بمُتصفِح الملفات من خلال إِعدادات الضَبْط. (ألقي نظرة على قائمة "View"). ليس الأمر بنفس السهولة إذا كُنت تَستخدِم نظام ماك. في العموم، تستطيع دومًا أن تَستخدِم الأمر ls -a بنافذة سطر الأوامر (command line) لكي تَعرِض قائمة بأسماء الملفات الموجودة بمجلد معين بما في ذلك أية ملفات مخفية. إذا واجهتك مشكلة مع أي ملف مَخفِي (hidden file)، أَعِد تسميته ليُصبِح ملفًا عاديًا ثم عدِّله كما تشاء وأخيرًا أَعِد تسميته مرة آخرى. يُستخدَم الأمر mv لإعادة تسمية الملفات مثل mv .bash_profile temp و mv temp .bash_profile.

في المقابل، لا يُوفِّر نظام ويندوز ملفًا لنافذة الأوامر cmd كالملفات ‎.bashrc أو ‎.bash_profile. كحل بديل، قد تُنشِئ ملف نص برمجي (script file) يُنفِّذ أمرًا. فمثلًا لتَصْرِيف برامج JavaFX، انشِئ ملفًا اسمه jfxc.bat يَحتوِي على سطر مُماثِل لما يلي:

javac -p C:\Users\eck\openjfx-sdk-11\lib --add-modules=ALL-MODULES-PATH $*

لكن بالطبع باِستخدَام مسار JavaFX الخاص بحاسوبك. تُمثِل ‎‎$*‎ مُدْخَلات الأمر javac. قد يَكُون الملف المُدْخَل موجودًا بالمجلد الحالي (current directory) أو بأي مكان آخر بمسار النظام (system path) مثل مجلد "bin" الخاص بعُدة تطوير جافا (JDK). تستطيع الآن أن تَستخدِم jfxc كأمر لتَصرِيف (compiling) البرامج المُستخدِمة لمكتبة JavaFX كالتالي:

jfxc MyJavaFXProgram.java

يُمكِنك أن تُطبِّق الشيء نفسه مع الأمر java.

بيئة تطوير إكلبس المتكاملة (Eclipse)

تَتَضمَّن بيئات التطوير المُتكاملة (Integrated Development Environment - IDE) كل شيء قد تحتاج إليه لإنشاء البرامج وتَصْرِيفها وتشْغِيلها ضِمن حزمة واحدة مُدعَّمة بواجهة مُستخدِم رُسومية (graphical user interface) مألوفة لغالبية مُستخدِمي الحاسوب. تَتَوفَّر مجموعة من بيئات التطوير المتكاملة لبرامج الجافا تتراوح من مجرد برامج بسيطة تعمل كغلاف لعُدة تطوير جافا (JDK) إلى تطبيقات معقدة تتميز بالعديد من الخاصيات. نظرًا لصعوبة تَعلُّم كُلًا من بيئات التطوير المتكاملة (IDE) ومفاهيم البرمجة نفسها في نفس الوقت، لا يُحبَّذ في العموم اِستخدَامها من قِبَل المُبرمجين المُبتدئين. سنتناول هنا بيئة تطوير إكلبس المُتكاملة (Eclipse IDE) بشيء من التفصيل وكذلك البديل الأكثر بساطة BlueJ على نحوٍ مختصر نوعًا ما. تتميز بيئات التطوير المُتكاملة (IDEs) بالكثير من السمات المفيدة حتى للمبرمج المبتدئ ولكنه عادةً ما سيتَجاهلها خاصة بالبداية.

إذا لم تَكُن تَستخدِم نُسخة أوراكل من عُدة تطوير جافا (JDK) إصدار ٨ أو ٩ أو ١٠، فينبغي أن تَضْبُط بعض الإعدادت الآخرى لكي تَتَمكَّن من اِستخدَام إكلبس (Eclipse) مع البرامج المُستخدِمة لمكتبة JavaFX، وهو ما سنتناوله بالقسم الفرعي التالي. خلال هذا القسم، سنُناقش كيف يُمكِننا أن نَستخدِم إكلبس لكي نُنشِئ برامجًا تَعتمِد فقط على أصناف جافا القياسية (standard classes).

يُمكِنك أن تُحمِّل بيئة تطوير إكلبس المُتكاملة (Eclipse IDE) من موقع إكلبس. حمِّل حزمة بيئة إكلبس لمطوري الجافا (Eclipse IDE for Java Developers)

إذا كنت تَستخدِم نظام ويندوز أو لينكس، سيَكُون الملف المُحمَّل بهيئة ملف أرشيفي مَضغُوط. اِستخرِج مُحتوياته إلى مجلد بأي مكان ثم اُنقُر نقرة مزدوجة على أيقونة تطبيق إكلبس (Eclipse) التي ستَجِدها بذلك المجلد لتَشْغِيل البرنامج. إذا كنت تَستخدِم نظام ماك، فسيَكُون امتداد الملف المُحمَّل هو ‎.dmg، يُمكِنك فتحه وسحبه إلى أي مكان تُفضِّله (ربما مُجلد التطبيقات).

إكلبس (Eclipse) هو برنامج مجاني مَكْتُوب بلغة الجافا، ويَتَطلَّب عُدة تطوير جافا (JDK) إصدار ٨ أو أحدث لذا لابُدّ أن تُثبِّت عُدة تطوير جافا (JDK) قَبْل أن تُحاوِل تَشْغِيله. ملحوظة لمُستخدمِي ماك: منذ يونيو ٢٠١٩، تَسبَّب خطأ برمجي (bug) بإكلبس (Eclipse) بمنع تَشْغِيله مع عدة تطوير جافا (JDK) إصدار ١٢، لذا إذا كنت تُريد اِستخدَام إكلبس (Eclipse)، يُفضَّل أن تَعتمِد على الإصدار ١١ من JDK إلى أن يُصلَّح ذلك الخطأ.

سيَطلُب منك برنامج إكلبس عند تَشْغِيله لأول مرة تَخْصِيص مساحة عمل (workspace) عبارة عن مجلد لتَخْزِين الملفات التي ستَعمَل عليها. يُمكِنك أن توافق على الاسم الافتراضي أو قد تُخصِّص أي اسم آخر. في الواقع، يُمكِنك أن تَستخدِم أكثر من مساحة عمل واحدة (workspaces) ثم تختار واحدة منها عند تَشْغِيله. عند فَتْح مساحة عمل (workspace) لأول مرة، ستَظهَر شاشة ترحيب كبيرة تَتَضمَّن روابط إلى عدة دروس إلى جانب التوثيق (documentation). اِضغَط على زر "X" الموجود إلى جوار كلمة "Welcome" لإغلاق الشاشة. يُمكِنك فَتْحها لاحقًا باختيار "Welcome" من قائمة "Help".

تَتَكوَّن واجهة برنامج إكلبس (Eclipse) الرُسومية من نافذة كبيرة مُجزَّئة إلى عدة أقسام (section) يَتَكوَّن كُلًا منها من عَرْض (view) واحد أو أكثر. يُوضِح كل عَرْض (view) نوعًا مُختلفًا من المعلومات، فيُمكِن أن يَكُون بهيئة مُحرر نصي (text editor) أو مساحة لعمليات الخَرْج والدَخْل (I/O) أو قائمة بالمشروعات الخاصة بك. إذا كان هناك أكثر من عَرْض (view) ضِمْن قسم (section) واحد، فسيَظهَر شريط نوافذ (tabs) بالجزء العلوي من ذلك القسم يَسمَح لك باختيار العَرْض (view) الذي تَرغَب بإظهاره. يُطلَق اسم "منظور (perspective)" على مجموعة عُروض (views). يَستخدِم إكلبس (Eclipse) منظورات (perspectives) مختلفة لمجموعات مختلفة من العُروض (views) تَخُص أنواعًا مختلفة من المعلومات. ستحتاج عمومًا إلى ما يُعرَف باسم "منظور الجافا (java perspective)" لتَصْرِيف البرامج وتَشْغِيلها، وهو في الواقع المنظور الافتراضي. عندما تُصبِح أكثر خبرة، ستَستخدِم على الأغلب "منظور تَنْقِيح الأخطاء (debug perspective)" للعُثور على الأخطاء الدلالية (semantic errors) بالبرامج. توجد أزرار صغيرة بشريط أدوات إكلبس (Eclipse) للتَبْدِيل بين المنظورات (perspectives) المختلفة.

يَتَكوَّن "منظور الجافا (java perspective)" من مساحة كبيرة بمنتصف النافذة تَحتوِي على عَرْض (view) واحد أو أكثر بهيئة مُحرر نصي (text editor). في الواقع، ستُنشِي البرامج وتُعدِّلها بتلك المساحة. على الجانب الأيسر منها، ستَجِد عَرْض بهيئة مُستكْشِف حزم (package explorer) يَعرِض قائمة بمشروعات الجافا وبملفات الشيفرة المصدرية (source code). على الجانب الأيمن منها، ستَجِد عدة عروض (views) آخرى غَيْر مُهِمّة لذلك يُمكِنك أن تُغلِقها بالنَقْر على "X" الموجود بجانب اسم كُلًا منها. بالإضافة إلى ذلك، ستَجِد عدة عروض (views) آخرى مفيدة أسفل مساحة التَعْدِيل. إذا أغلقت عَرْضًا (views) مُهِمًّا عن طريق الخطأ كمُستكِشف الحزم (package explorer)، يُمكِنك أن تُظهِره مُجددًا عن طريق اختياره من القائمة الفرعية "Show View" من قائمة "Window". يُمكِنك إعادة ضَبْط النافذة بالكامل إلى محتوياتها الافتراضية عن طريق اختيار "Reset Perspective" من قائمة "Window".

لبدء العمل على إكلبس (Eclipse)، ينبغي أولًا أن تُنشِئ مشروعًا (project): اِختر الأمر "Java Project" من القائمة الفرعية "New" بقائمة "File". ستَظهَر نافذة أمامك، املأ حقل "اسم المشروع (Project Name)" بأي شيء تريده ثم اِضغَط على زر "Finish". قد يسألك إكلبس عما إذا كنت تُريد أن تُنشِئ ملف module-info.java، ولأننا لن نَستخدِم أية وحدات (modules) بأي برنامج نهائيًا، اُنقر دومًا على "Don't Create". اُنظر القسم الفرعي ٤.٦.٤ لمزيد من المعلومات عن الوحدات (modules). لابُدّ أن يَظهَر المشروع الآن بعَرْض (view) "مُستكِشف الحزم (package explorer)". اُنقُر على علامة المربع أو المثلث الصغيرة الموجودة إلى جانب اسم المشروع لترى مُحتوياته. إذا كنت تَستخدِم الإعدادات الافتراضية، ينبغي أن تَجِد مُجلد اسمه "src" مُخصَّص لملفات الشيفرة المصدرية لذلك المشروع، وستَجِد أيضًا "مكتبات بيئة تّنْفيذ الجافا (JRE System Library)" مُكوَّنة من مجموعة من الأصناف القياسية المَبنية مُسْبَقًا (standard built-in classes).

لتَشْغيِل أي من برامج الجافا المَعرُوضة هنا، ينبغي أن تَنسَخ ملف الشيفرة المصدرية (source code) للبرنامج إلى مشروع الجافا بتطبيق إكلبس (Eclipse). إذا كُنت قد حمَّلت ذلك الملف إلى حاسوبك، تستطيع ببساطة أن تَنسخُه وتُلصقه إلى نافذة إكلبس كما يلي: اُنقُر بزر الفأرة الأيمن على أيقونة الملف ثُمَّ اِختَر "اِنسَخ (Copy)" من القائمة ثُمَّ اُنقُر بزر الفأرة الأيمن على مُجلد "src" بالمشروع بنافذة إكلبس واِختَر "اِلصِق (Paste)". تَأكَّد من لَصْقُه بمُجلد "src" لا مجلد المشروع نفسه، فالملفات الموجودة خارج مُجلد "src" لا تُعامَل كملفات شيفرة مصدرية. بدلًا من ذلك، يُمكِنك أن تَسحَب أيقونة الملف من نافذة مُتصفِح الملفات إلى مجلد "src" بنافذة إكلبس.

لكَوْن الأمثلة هنا مُعتمِدة على الصَنْف TextIO غَيْر القياسي، ينبغي إذًا أن تُضيِف الملف TextIO.java إلى المشروع بحيث يَقَع ضِمْن حزمة اسمها textio. إذا كُنت قد حمَّلت ذلك الملف إلى حاسوبك بمُجلد اسمه "textio" كما أَوضَحنا مُسْبَقًا، يُمكِنك نَسخُه ولَصقُه إلى مجلد المشروع "src". بدلًا من ذلك، يُمكِنك أن تُنشِئ الحزمة textio باختيار الأمر "New/Package" من قائمة "File". سيُنشِئ ذلك مجلدًا جديدًا اسمه "textio" بالمشروع، وعليه، تستطيع نَسْخ الملف TextIO.java بداخله. أيًا كانت الطريقة المُستخدَمة، لابُدّ أن يَحتوِي مجلد المشروع "src" على الملف TextIO.java داخل مجلد ثانوي اسمه هو textio. إذا وَضعَت ملفًا بمكان غَيْر صحيح عن طريق الخطأ، يُمكِنك سَحْبه من مكانه إلى أي مكان آخر بـ"مستكشف الحزم (package explorer)".

بَعْدما تُضيِف برنامج الجافا إلى مشروعك، اُنقُر نقرة مزدوجة على اسم الملف الموجود بعَرْض "مُستكِشف الحزم (package explorer)" لفَتْح البرنامج ثم اُنقُر بزر الفأرة الأيمن على نافذة المُحرّر أو على اسم الملف بمُستكِشف الحزم واِختَر "Java Application" من القائمة الفرعية "Run As" لتّنْفيذ البرنامج. إذا كان البرنامج مُصمَّمًا ليَكْتُب إلى الخَرْج القياسي (standard output)، فسيَظهَر الخَرْج بالعَرْض "Console" بالقسم الواقع أسفل المُحرّر بنافذة إكلبس. إذا كان البرنامج يَستخدِم أي من الصَنْفين TextIO أو Scanner لقراءة أية مُدْخَلات (input)، ستَضطّر إلى كتابة المُدْخَلات المطلوبة بالعَرْض "Console". لاحِظ أنك ستحتاج للضَغْط على ذلك العَرْض قبل البدء بالكتابة لكي تتأكَّد من إرسال المحارف التي ستَكْتُبها إلى القسم الصحيح من نافذة إكلبس. تَتَوفَّر طريقة أسهل لتَشْغيل البرنامج: اِضغَط على زر "شَغِّل (Run)" بشريط أدوات إكلبس. وفقًا للسياق، سيؤدي ذلك إلى تَشْغِيل البرنامج المَعرُوض بنافذة المُحرّر أو البرنامج المُختار بمُستكِشف الحزم (package explorer) أو أحدث برنامج كان مُشغَّلًا للتو. ملحوظة: عندما تُشغِّل برنامجًا بإكلبس، فليس هناك خُطوة مُنفصِلة لعملية التَصرِيف (compilation) حيث تُصرَّف ملفات البرنامج أتوماتيكيًا.

يُمكِنك أن تُضيِف أكثر من برنامج إلى نفس المشروع أو قد تُنشِئ مشروعات إضافية لتَنْظِيم العمل على نحو أفضل. تَذكَّر دومًا أن تُضيِف نُسخة من الصَنْف TextIO.java بمجلد اسمه textio بأي مشروع يَستخدِمه.

إذا كنت تريد أن تُنشِئ برنامج جافا جديد بإكلبس، لابُدّ إذًا من أن تُنشِئ صنفًا (class) جديدًا: اُنقُر بزر الفأرة الأيمن على اسم المشروع بمُستكِشف المشروع (Project Explorer) ثم اُنقُر على القائمة الفرعية "New" ثم اِختَر "Class". بدلًا من ذلك، تستطيع أن تَنقُر على واحدة من الأيقونات الصغيرة بصندوق الأدوات أعلى نافذة إكلبس. بالنافذة المفتوحة، اُكْتُب اسم الصنف (class) -وليس اسم ملف الشيفرة المصدرية- الذي تريد أن تُنشئه بشَّرط أن يَكُون عبارة عن اسم مُعرف هوية (identifier) صالح. تَتَضمَّن النافذة صندوق إدخال آخر بعنوان "حزمة (Package)" حيث يُمكِنك أن تُخصِّص اسم الحزمة (package) المطلوب إضافة الصَنْف إليها. تَستخدِم غالبية الأمثلة بهذا الكتاب "الحزمة الافتراضية (default package)". اُترك صندوق الإدخال فارغًا لكي تَستخدِم الحزمة الافتراضية، ولكن يُمكِنك أيضًا أن تُخصِّص اسم حزمة إذا أردت. أخيرًا، اضغط على زر "Finish" لإنشاء الصنف، والذي ينبغي أن يَظهَر بالمجلد "src" داخل مجلد فرعي مُناظِر للحزمة (package) المُخصَّصة كما سيُفتَح الملف الجديد أتوماتيكيًا بمساحة التعديل (editing area) لكي تََتَمكَّن من البدء بالكتابة.

يُوفِّر إكلبس خاصيات مُتعدّدة ستُساعدك حتمًا أثناء كتابة الشيفرة. على سبيل المثال، يَظهَر خط أحمر خشن أسفل أي خطأ في بناء الجملة (syntax error)، وفي بعض الحالات، تَظهَر علامة خطأ إلى الجانب الأيسر من نافذة المُحرر، والتي تَعرِض وصفًا للخطأ إذا حومت (hover) مؤشر الفأرة عليها أو على الخطأ نفسه. لا ينبغي أن تُحاوِل التَخلُّص من كل خطأ يَظهَر أثناء كتابة الشيفرة خاصة وأن بعضها يَختفِي تلقائيًا بَعْدما تُكمِل كتابة البرنامج. إذا كانت علامة الخطأ بهيئة مصباح كهربي، يَعنِي ذلك أن إكلبس يَعرِض محاولة لإصلاح الخطأ أتوماتيكيًا. اِضغَط على علامة المصباح أو حوم (hover) مؤشر الفأرة على الخطأ الفعليّ للحصول على قائمة بالحلول المُحتمَلة. يُمكِنك الضَغْط على أي منها لتطبيق الحل. على سبيل المثال، إذا اِستخدَمت مُتْغيِّرًا (variable) بدون أن تُصرِّح عنه، سيَعرِض إكلبس إمكانية التَصْرِيح (declare) عنه أتوماتيكيًا مما يعني السماح لإكلبس بكتابة أنواع محددة من الشيفرة. ملحوظة: لن تَفهَم جميع الحلول التي يقترحها إكلبس حتى تَتَعلَّم المزيد عن لغة الجافا لذا لا تُحاوِل تطبيق أي حل لا تفهمه فعادةً ما سيَجعَل ذلك الأمور اسوأ في النهاية.

يَعثُر إكلبس (Eclipse) أيضًا على أخطاء التهجئة بالتعليقات (comments) ويَضَع خطًا أحمرًا خشنًا أسفلها. حوم مؤشر الفأرة على واحدًا من تلك الأخطاء لتَجِد قائمة بالحلول الصحيحة المُحتمَلة.

يتميز إكلبس بخاصية أخرى أساسية هي مُساعد المُحتوى (content assist) المُستخدَمة لعَرْض التكميلات المُحتمَلة لما تَكْتبه بتلك اللحظة. يُمكِنك استدعاء المساعد بالضَغْط على زري "Control-Space". على سبيل المثال، إذا كُنت تَكْتب جُزءًا من مُعرِّف هوية (identifier) ثم ضَغْطت على زري "Control-Space"، ستَظهَر قائمة بكل مُعرِّفات الهوية المتاحة البادئة بالمحارف التي كُنت قد كَتْبَتها. اِستخدِم مفتاحي الأسهم (arrow keys) "لأعلى" و "لأسفل" لاختيار أي عنصر بالقائمة ثم اضغط "Enter". يُمكِنك أيضًا أن تَنقُر على أي عنصر باِستخدَام الفأرة لاختياره أو قد تَضغَط على "Escape" لإخفاء القائمة. إذا ضَغطَت على "Control-Space" وكان هنالك احتمالًا تَكْميليًا واحدًا، فسيُكتَب أتوماتيكيًا. يظهر مساعد المحتوى (content assist) تلقائيًا بصورة افتراضية عند كتابة نقطة أو عدة محارف آخرى، فمثلًا، إذا كَتَبَت "TextIO.‎" ثم اِنتظرت لجزء من الثانية، ستَظهَر قائمة بجميع البرامج الفرعية (subroutines) المُعرََّفة بالصَنْف TextIO. يُمكِنك إلغاء التَفْعِيل التلقائي لتلك الخاصية من خلال إعدادات إكلبس (جافا > المحرر > مساعد المحتوى). ما يزال بإمكانك استدعائه يدويًا باستخدام زري "Control-Space".

بمُجرد أن يُصبِح برنامجك خالٍ من الأخطاء، يُمكِنك أن تُشغِّله كما أوضحنا بالأعلى. إذا وجدت مشكلة عند تَشْغِيله، عُد إلى المُحرّر لتجُرِي التعديلات المطلوبة ثُمَّ جَرِّب تَشْغِيله مرة آخرى.

استخدام JavaFX ببيئة تطوير إكلبس (Eclipse)

إذا كنت تَستخدِم إصدارً من عُدة تطوير جافا (JDK) لا يَحتوِي على مكتبة JavaFX، فلابُد من أن تَضبُط مشروعات إكلبس لكي تَتَمكَّن من اِستخدَام تلك المكتبة. تَتَوفَّر في الواقع الكثير من الطرائق للقيام بذلك. سنَعرِض واحدة منها هنا والتي ليست بالضرورة أصحها أو أفضلها، فنحن فقط نحتاج إلى تَطْوِير بعض البرامج البسيطة المُعتمِدة على JavaFX. سنَضبُط إحدى إعدادات مساحة العمل (workspace) بإكلبس (Eclipse). تَعمَل هذه الطريقة مع كُلًا من الإصدار ١١ من الجافا وبيئة إكلبس (Eclipse) حتى إصدار يونيو ٢٠١٩. قد لا تتوافق هذه الطريقة مع الإصدارات الأحدث من كُلًا منهما.

اِختَر الأمر "Preferences" من قائمة "Windows" بنظامي لينكس وويندوز أو من قائمة "Eclipse" بنظام ماك لفَتْح نافذة الإِعدادات المُفضَّلة. اُنقُر على علامة المربع أو المثلث الصغيرة الموجودة إلى جانب كلمة "Java" بالقائمة على يسار النافذة لفَتْح قسم "Java" ثم اُنقُر على "بيئات تّنْفيذ جافا المُثبَّتة (Installed JREs)". ستَظهَر قائمة ببيئات الجافا (Java environments) التي تَعرَّف عليها إكلبس بالفعل. يُمكِنك القيام بأمر من اثنين: اِضغَط على الزر "Add" لإضافة بيئة تّنْفيذ جافا (JRE) جديدة أو اِختَر واحدة من تلك الموجودة بالقائمة واِضغَط على "Edit". إذا اِختَرت إضافة بيئة تّنْفيذ جديدة، سيَظهَر صندوق يسألك عن نوع بيئة التّنْفيذ (JRE Type)، اِختَر "Standard VM" ثم اِضغَط على "Next". سيَظهَر صندوق مُشابه للصورة بالأسفل. في المقابل، إذا اِختَرت التَعْدِيل على بيئة تّنْفيذ (JRE) موجودة، فإن الحقلين "مسار بيئة التّنْفيذ (JRE Home)" و "اسم بيئة التنفيذ (JRE name)" سيَكُونا مملوئين بالفعل أما حقل "مكتبات بيئة تّنْفيذ الجافا (JRE system libraries)" فسيَكُون فارغًا.

001Eclipse_fx.png

إذا اِختَرت إضافة بيئة تّنْفيذ جافا (JRE) جديدة، ستَحتاج إلى تَخْصِيص "مسار بيئة التّنْفيذ (JRE Home)". لابُدّ أن يَحتوِي المجلد الذي يُشير إليه ذلك المسار على مجلد "bin" بعُدة تطوير جافا. اِضغَط على زر "Directory" لفَتْح مُتصفِح الملفات ثم اِختَر المجلد. يُمكِنك اختيار عُدة تطوير جافا (JDK) مُثبَّتة على الحاسوب أو لا. بالمثال المُوضَّح بالصورة، كانت عُدة تَطوِير جافا (JDK) مُثبَّتة على نظام لينكس. إذا كنت تَستخدِم ويندوز أو لينكس، اِختَر مجلد JDK الرئيسي أما إذا كنت تَستخدِم نظام ماك، فاِختَر مجلد "Home" الموجود بمجلد "Content" الموجود بمجلد JDK الرئيسي أي لابُدّ أن يَنتهِي المسار بـ"‎/Content/Home". إذا أَدْخَلت مُجلد عُدة تطوير (JDK) صالح، فسيَملأ إكلبس كُلًا من "اسم بيئة التّنْفيذ (JRE name)" و"مكتبات النظام (system library)" تلقائيًا.

لابُدّ أن تَكون مكتبة JavaFX مُتاحة للبرنامج خلال زمني التَصْرِيف (compile time) والتَشْغِيل (run time). بالنسبة لزمن التصريف (compile time)، يُمكِنك أن تُضيِف ملفات المكتبة ‎.jar إلى مكتبات النظام (system libraries): اِضغَط على زر "Add External JARs" ثم اِنتقِل إلى مجلد "lib" الموجود بمجلد عُدة تطوير جافا إف إكس (JavaFX SDK) المُحمَّلة أو المُثبَّتة. ستَجِد سبعة ملفات مُنتهيّة بالامتداد ‎.jar، اِخترها جميعًا ثم اُنقُر على "OK". ينبغي أن تَظهَر جميعًا بقائمة "مكتبات بيئة تّنْفيذ الجافا (JRE system libraries)".

بالنسبة لزمن التَشْغِيل (run time)، ينبغي أن تُضيِف عدة وسائط (arguments) إلى صندوق "Default VM arguments" يدويًا. يَتَضمَّن ذلك الصندوق عدة خيارات ستُضَاف إلى الأمر java عندما تُشغِّل برنامجًا باِستخدَام تلك النُسخة من عُدة التطوير (JDK). ينبغي أن تَكْتُب نفس الخيارات التي كنت تَستخدِمها مع سطر الأوامر (command line) كما ناقشنا بالأعلى، فمثلًا، قيمة الخيار ‎-p أو ‎--module-path هي مسار المجلد "lib" الخاص بمكتبة JavaFX أما قيمة الخيار ‎--add-modules فيُمكِن أن تَكُون "ALL-MODULE-PATH".

عندما تَنتهِي من ضَبْط كل شيء، اُنقُر على "Finish" ثم اُنقُر على "Apply and Close" بنافذة "الإعدادات المُفضَّلة (Preferences)" الرئيسية. عندما تُنشِئ مشروع جافا جديد بمساحة العمل (workspace)، اِختَر بيئة التّنْفيذ (JRE) التي أَضفتها أو عدَّلتها للتو بنافذة إِنشاء المشروع. ينبغي الآن أن تَكُون قادرًا على اِستخدَام مكتبة JavaFX ضِمْن ذلك المشروع. إذا واجهتك مشكلة، اِفحَص إعدادات بيئة تّنْفيذ الجافا (JRE).

ملحوظة: ليس هنالك أي ضرر من اِستخدَام بيئة تّنفيذ (JRE) مُدعِّمة لمكتبة JavaFX مع البرامج العادية التي لا تَستخدِم تلك المكتبة. بتعبير آخر، يُمكِنك أن تَستخدِم نفس الإعدادات السابقة مع كل البرامج التي سنتناولها لاحقًا.

بيئة التطوير BlueJ

تُعدّ بيئة التطوير BlueJ مُوجَّهة للمبتدئين الراغبين بتَعلُّم البرمجة. هي في العموم أقل تعقيدًا بكثير من بيئة إكلبس (Eclipse) ولكنها مع ذلك تُوفِّر مجموعة من الخاصيات المفيدة للأغراض التعليمية. يُمكِنك أن تُحمِّل بيئة BlueJ من موقعها الرسمي. يتوافق إصدارها الحالي مع الإصدار ١١ من كُلًا من الجافا و جافا إف إكس (JavaFX) كما يَتَوفَّر إصدار سابق متوافق مع الإصدار ٨ من الجافا. عندما تُشغِّل BlueJ لأول مرة، سيَطلُب منك إدخال مسار كُلًا من JDK و JavaFX. تستطيع الآن أن تُصرِّف البرامج المُستخدِمة لمكتبة JavaFX وتُشغِّلها باستخدام بيئة BlueJ.

يُمكِنك أن تُنشِئ مشروعًا جديدًا باختيار الأمر "New Project" من قائمة "Project". لاحِظ أن المشروع ببيئة BlueJ عبارة عن مجلد. عندما تُنشِئ أي مشروع جديد، سيتعيَّن عليك اختيار اسم ذلك المجلد. ستُنشِئ بيئة BlueJ المجلد وستَفتَح نافذة تَعرِض مُحتوياته بهيئة أيقونات. يُمكِنك أن تُضيِف أي ملف ‎.java إلى المشروع بسَحبُه من نظام الملفات (file system) إلى النافذة. سيُنسَخ الملف إلى مجلد المشروع وسيَظهَر أيضًا على النافذة. في المقابل، يُمكِنك أن تَنسَخ أي ملف مُباشرةً إلى مجلد المشروع، ولكنك لن تراه بيئة BlueJ حتى تُعيد فَتْح المشروع. عندما تُعيد تَشْغِيل بيئة BlueJ، سيَظهَر آخر مشروع كُنت تَعمَل عليه، ولكن يُمكنِك طبعًا فَتْح أي مشروع آخر من أحد الأوامر (command) بقائمة "Project".

ستَجِد زرًا بنافذة المشروع لإنشاء صَنْف (class) جديد. عند النَقْر عليه، يُضيِف BlueJ أيقونة صَنْف إلى النافذة ويُنشِئ ملف شيفرة مصدرية بامتداد ‎.java بمُجلد المشروع لكنه لا يَفتَحه تلقائيًا. يُمكِنك أن تَنقُر على أيقونة أي ملف نقرةً مزدوجة لفَتْحه، وسيَظهَر عندها مُحرّر يَعرِض مُحتوياته ضِمْن نافذة مُنفصلة. ستُلاحِظ أن أي صَنْف (class) جديد يَتَضمَّن افتراضيًا شيفرة لن تَرغَب بها عادةً. يُمكِنك حَذفَها وإضافة البرنامج main()‎ بدلًا منها. يَختلِف مُحرّر بيئة BlueJ عن مُحرّر Eclipse بعدة أمور: أولًا، لا يَعرِض مُحرّر BlueJ أية أخطاء (errors) أثناء كتابة الشيفرة وإنما يُبلِّغ عنها عند محاولة تَصْرِيف (compile) البرنامج. ثانيًا، لا يَقترِح المُحرّر أية حلول تلقائية لأي من تلك الأخطاء. ثالثًا، يُوفِّر مُحرّر BlueJ مُساعد مُحتوى (content assist) بدائي يَقْتصِر دوره على عَرْض البرامج الفرعية (subroutines) المُعرَّفة بصَنْف (class) أو كائن (object). اِضغَط على زري "Control-Space" لاستدعائه بَعْد كتابة النقطة التي تأتي بَعْد اسم الصَنْف أو الكائن.

تَحتوِي نافذة المُحرّر على زر لتَصْرِيف (compile) البرنامج المَعرُوض بينما تَحتوِي نافذة المشروع على زر آخر لتَصْرِيف جميع الأصناف (classes) ضِمْن المشروع.

لابُدّ أن تُصرِّف (compile) البرنامج أولًا لكي تَتَمكَّن من تَشْغِيله. اُنقُر بزر الفأرة الأيمن على أيقونة البرنامج المُصرَّف. ستَظهَر قائمة، اِختَر منها "void main(String[] args)‎" لتَشْغِيل البرنامج ثم اُنقُر على "OK". ستُفتَح بَعْد ذلك نافذة مُنفصلة تَستقبِل مُدْخَلات البرنامج وتَعرِض مُخْرَجاته.

يُمكِنك أن تُشغِّل أي برنامج فرعي (subroutine) وليس فقط البرنامج main ببيئة التَطوِير BlueJ، وهو ما يُعدّ واحدًا من أفضل مميزاتها. إذا كان لديك صَنْف (class) يَحتوِي على برامج فرعية (subroutines) آخرى غير البرنامج main، فستَجِدها ضِمْن القائمة المَعرُوضة بَعْد النَقْر بزر الفأرة الأيمن على أيقونة الصَنْف. إذا كان البرنامج (routine) يَتَطلَّب أية مُعاملات (parameters)، فسيُسمَح لك بإِدْخَالها عَبْر نافذة، وإذا كان دالة (function) -أي يُعيد قيمة-، فسيَظهَر صندوق آخر بَعْد تّنْفِيذ البرنامج ليُخبرِك بقيمته المُعادة (return value) مما يَسمَح لك بإجراء اختبار لأي برنامج فرعي (subroutine) بشكل مُستقِل. بالإضافة إلى ذلك، تستطيع أيضًا أن تُنشِئ كائنًا (object) من صَنْف معين ببيئة BlueJ، وستَظهَر بَعْدها أيقونة للكائن (object) أسفل نافذة المشروع. يُمكِنك أن تَنقُر بزر الفأرة الأيمن على أيقونة الكائن لتَحصُل على قائمة بجميع البرامج الفرعية (subroutines) المُعرَّفة بداخله. بالطبع لن يَكُون ذلك مفيدًا لك حتى نَصِل إلى الفصل الخامس حيث سنَتَعلَّم البرمجة كائنية التوجه (object-oriented programming).

الحزم (packages)

يَقَع أي صَنْف (class) بالجافا ضِمْن شيء يُطلق عليه اسم "حزمة (package)". تُعرَّف الأصناف التي لا يُعلَّن صراحةً عن وقوعها ضِمْن حزمة داخل "الحزمة الافتراضية (default package)" تلقائيًا. تَقَع جميع أصناف الجافا القياسية (standard classes) ضِمْن حزم مُسمَاة (named packages)، فمثلًا، الأصناف String و System مُعرَّفة ضِمْن حزمة java.lang، والتي تُستورَد (import) جميع أصنافها تلقائيًا إلى أي ملف جافا. في المقابل، ينبغي أن تَستخدِم المُوجِّه import لاستيراد الأصناف المُعرَّفة بأي حزم آخرى غَيْر حزمة java.lang. على سبيل المثال، يَقَع الصَنْف TextIO بحزمة اسمها textio لذا ينبغي أن تَستورِدها إلى أي برنامج يرغب باِستخدَامها. سنُناقش الحزم (packages) على نحو مُفصَّل بالقسم ٤.٦. تحتاج الآن فقط إلى مَعرِفة بعض الحقائق البسيطة.

وفقًا للقواعد الإرشادية الرسمية للجافا، لا يُنصَح باِستخدَام الحزمة الافتراضية (default package)، ولكننا سنَعتمِد عليها بغالبية الأمثلة؛ لأنه من الأسهل دومًا للمبرمجين المبتدئين تَجنُّب أي حديث عن الحزم (packages) قَدْر الإمكان. إذا كنت تُنشِئ صنفًا (class) وحَاوَل إكلبس (Eclipse) أن يَضَعه ضِمْن حزمة، يُمكِنك حَذْف اسم الحزمة من نافذة إنشاء الصَنْف لتُجبره على اِستخدَام الحزمة الافتراضية (default package). في المقابل، إذا كان لديك صَنْف داخل حزمة (package) بالفعل، فستبدأ شيفرة ذلك الصَنْف بسطر يُخصِّص اسم الحزمة التي يَقَع ضِمْنها الصَنْف، فمثلًا، إذا كان الصَنْف بحزمة اسمها test.pkg، فسيَكُون أول سطر من ملف الصَنْف كالتالي:

package test.pkg;

على سبيل المثال، يبدأ ملف الشيفرة المصدرية للصَنْف TextIO بالسطر package textio;‎. لقد اِختَرنا تَعرِيف الصَنْف TextIO ضِمْن حزمة مُخصَّصة لأنه لا يُمكِن لأي صَنْف (class) يَقَع ضِمْن حزمة (package) غَيْر افتراضية أن يَستخدِم صَنْفًا من الحزمة الافتراضية (default package) أي إذا كان الصَنْف TextIO ضِمْن الحزمة الافتراضية، فيُمكِنك اِستخدَامه بالبرامج الواقعة ضِمْن الحزمة الافتراضية فقط. في الواقع، لقد كان الصَنْف TextIO مُعرَّفًا داخل الحزمة الافتراضية (default package) بالنُسخ الأقدم من هذا الكتاب.

ملحوظة: ستُواجِه بعض التَعْقيدات إذا استخدَمت الحزم (packages) ببيئة سطر الأوامر (command-line environment). فلنَفْترِض مثلًا أنك عرَّفت برنامجًا ضِمْن حزمة اسمها text.pkg، لابُدّ إذًا أن يَقَع ملف ذلك البرنامج بمجلد فرعي اسمه "pkg" داخل مجلد آخر اسمه "test" والذي يَقَع بدوره داخل مُجلد العمل الرئيسي. في نفس الوقت، لابُدّ أن تَعمَل بمجلد العمل الرئيسي (main directory) أثناء تَصرِيف أي برنامج أو تّنْفِيذه. لذا عندما تُصرِّف (compile) ملف الشيفرة المصدرية لذلك البرنامج، ستَضطّر إلى كتابة اسم المجلد. على سبيل المثال، لتَصرِيف البرنامج الوَاقِع ضِمْن الحزمة test.pkg، ستَضطّر إلى اِستخدَام الأمر javac test/pkg/ClassName.java إذا كنت تَستخدِم لينكس أو ماك أو الأمر javac test\pkg\ClassName.java إذا كنت تَستخدِم ويندوز. بالنسبة لتّنْفِيذ البرنامج، فستَستخدِم الأمر java test.pkg.ClassName مع نقطة تَفصِل اسم الحزمة (package) عن اسم الصَنْف (class).

الأمر jshell

تُعدّ أداة سطر الأوامر jshell جزءًا قياسيًا من عُدة تطوير جافا (JDK) إصدار ٩ أو أحدث. إذا كان لديك أيًا من تلك الإصدارات وتستطيع اِستخدَام الأمرين java و javac بسطر الأوامر (command line)، فبإمكانك أيضًا اِستخدَام أداة jshell. إذا كنت تَستخدِم نظام ماك، فقد تحتاج إلى تَخْصِيص المسار الكامل للملف التّنْفيذي jshell الموجود بمُجلد "bin" بعُدة تَطوِير جافا. يَسمَح لك الأمر jshell بكتابة شيفرة جافا وتّنفِيذها دون الحاجة لإنشاء ملف ‎.java وكتابة البرنامج main. اُكتُب الأمر jshell بنافذة سطر الأوامر لتَشْغِيله. ستَحصُل بَعْدها على محث الأمر jshell حيث ستَتَمكَّن من كتابة تَعْليمَة (statement) أو تعبير (expression) بالجافا. إذا أَدْخَلت تَعْليمَة، فإنها ستُنفَّذ أما إذا أَدْخَلت تعبيرًا، فستُطبَع قيمته. لاحِظ أنك لا تحتاج إلى كتابة فاصلة منقوطة (semicolon) بنهاية السطر. يَعرِض المثال التالي جلسة (session) قصيرة لاِستخدَام الأمر jshell:

$ jshell
|  Welcome to JShell -- Version 11.0.7
|  For an introduction type: /help intro

jshell> System.out.println("Hello World")
Hello World

jshell> int x = 42
x ==> 42

jshell> x * x
$3 ==> 1764

jshell> /exit
|  Goodbye

ستُساعدك أداة jshell بلا شك بينما تَتَعلَّم الجافا وتُجرِّب مميزاتها، ولكننا لن نتعمَّق في الحديث عنها. يُمكِنك مع ذلك الإطلاع على توثيقها بموقع أوراكل.

ترجمة -بتصرّف- للقسم Section 6: Programming Environments من فصل Chapter 2: Programming in the Small I: Names and Things من كتاب Introduction to Programming Using Java.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن