it-swarm.dev

متشرد لمشروع جافا: هل يجب أن تترجم في VM أو على المضيف؟

إليك السؤال: عند استخدام Vagrant لمشروع Java (أو أي مشروع لغة مترجمة لهذه المسألة) ، هل يجب أن تقوم بالتجميع في VM أو على المضيف؟ أيضًا ، هل ترغب في تشغيل IDE وجميع أدوات التطوير الخاصة بك من داخل VM أيضًا ، أو على المضيف؟

يبدو أن غير محدد جيدًا بالضبط كيف تعمل Java IDE وعملية التحويل البرمجي/النشر مع Vagrant VM. بشكل عام ، لدي انطباع بأن الشفرة يتم تحريرها على المضيف ، ويتم تشغيلها على VM ، والتي تعمل بشكل جيد للغات غير المترجمة. تتضمن الإجابات الأخرى على Stackoverflow أن المتشرد أقل فائدة للغات المترجمة بسبب خطوة الترجمة الإضافية ، لكن ما زلت أريد أن أرى ما يمكن القيام به.

بعض الأشياء التي فكرت فيها بالفعل:

لماذا ترجمة على VM

  • إذا كان التحويل البرمجي على Host ، فإن Java هي برنامج واحد آخر لتثبيته
  • إذا كان التحويل البرمجي على المضيف ، فيجب تحديث إصدار Java على المضيف يدويًا مع إصداره على جهاز VM
  • إصدار جافا المطابق على المضيف قد لا يكون متاحًا (على سبيل المثال ، في نظام Mac)

لماذا لديك IDE على جهاز VM

  • تشديد التكامل بين البيئة و IDE ، يمكن استخدام اختصارات لتشغيل التطبيق
  • يمكن توصيل مصحح أخطاء تطبيقات Java دون تصحيح الأخطاء عن بُعد (تشغيل/تصحيح خطوة واحدة)

لماذا ترجمة على المضيف

  • أسرع مرات الترجمة
  • ترغب في الحفاظ على VM أقرب ما يمكن أن يبدو عليه الإنتاج

لماذا لديك IDE على المضيف

  • يعد تعديل التعليمات البرمجية على المضيف وتشغيلها على جهاز VM بمثابة اتفاقية مبهمة
  • أداء أفضل لواجهة المستخدم (إعادة توجيه X و VNC بطيئة)

ما هي أفكارك: هل يجب عليّ تشغيل IDE من داخل VM أو المضيف؟ هل يجب أن أجمع من داخل VM أو المضيف؟

91
Jay

بعد الكثير من التفكير والتجريب ، قررت تحديد مكان استخدام Vagrant وكيف يتكامل مع سير عمل تطوير Java.

بالنسبة لتطبيقات JavaEE/المنشورة ، فإن تكوين خادم الويب وخادم قاعدة البيانات هي بالتأكيد أشياء ذات تعقيد "كافٍ" تضمن استخدام Vagrant. مع وجود خادمين وطرق لا تعد ولا تحصى لتكوينها ، من السهل على التكوين الخروج من المزامنة من مطور لآخر ، مما يؤدي إلى حدوث متلازمة "يعمل على الجهاز الخاص بي". بالنسبة لهذا النوع من البرامج ، سيكون من الأفضل تحرير الشفرة وتجميعها على المضيف ، ونشرها على Vagrant VM التي تحاكي بيئة الإنتاج لديك. يمكن ربط مجلد النشر لخادم الويب بهدف التحويل البرمجي على المضيف ، مما يلغي الحاجة إلى إعادة الانتشار يدويًا. لذلك يمكن أن يكون Vagrant جزءًا مهمًا من دورة حياة التطوير الخاصة بك ، ولكن وقت دورة الكود/الترجمة/النشر من المضيف وتشغيله على VM مع جافا سيكون أطول من وقت دورة الكود على المضيف وتشغيل على VM التي نراها مع PHP/Ruby/Node/etc.

بالنسبة لتطبيقات Java المستقلة (مثل المكتبات أو تطبيقات سطح المكتب) ، تتغير القصة قليلاً. في هذه الحالة ، يكون من المنطقي تحرير الجهاز المضيف وتجميعه وتشغيله ، مع تجنب استخدام المتشرد تمامًا. إذا كنت تستخدم أحد برامج Java IDE الكبيرة (Eclipse و Netbeans و IntelliJ ...) ، فأنت بالفعل قد قمت بتثبيت Java على الجهاز. عند هذه النقطة ، هناك ميزة قليلة جدًا مقارنةً بالنفقات العامة لاستخدام Vagrant ، وتعمل فقط على وضع طبقة إضافية من التعقيد في عملية التطوير الخاصة بك. هذا لأنه بحلول الوقت الذي تكون فيه قادرًا على تحرير Java باستخدام IDE يمكنك تشغيل كل شيء على المضيف على أي حال. مشكلة واحدة هي أن إصدار Java المطلوب للمشروع قد لا يتطابق مع الإصدار الذي يشغل IDE على المضيف. بشكل عام (نأمل) أن هذا ليس مشكلة كبيرة جدًا ؛ اعتبارًا من هذه الكتابة ، انتهى عمر JDK6 ولم يتم إصدار JDK8 بعد (تخمين أين يتركنا ذلك). ولكن إذا كنت بحاجة إلى تشغيل إصدارات متعددة ، فيجب أن تكون قادرًا على تعيين Java_HOME على المضيف حسب الحاجة. على الرغم من أن هذا يقدم تعقيدًا إضافيًا ، إلا أنه أقل تعقيدًا من الحفاظ على وقت تشغيل Vagrant فقط للعمل مع المشروعات التي تستخدم إصدارات مختلفة من Java.

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

نأمل أن يوفر ذلك لمطوري جافا المهتمين بـ Vagrant بعض السياق حول كيفية استخدامه.

60
Jay

كنت مهتمًا بهذا الموضوع خلال العام الماضي :)

الحل الخاص بي هو أن يكون لديك جهاز متشرد قابل للتشكيل باستخدام الأعلام. على سبيل المثال ، تُمكِّن إحدى هذه العلامة واجهة المستخدم الرسومية لسطح المكتب لأن بعض المطورين يفضلون الرمز على جهاز المضيف بينما يفضل البعض الآخر الحصول على بيئة أكثر تكاملاً مع سطح المكتب و IDE فيه.

لمواجهة بطء سطح المكتب ، يجب عليك تثبيت مكون إضافي مفيد جدًا (نعم ... يحتوي vagrant على مكونات إضافية تعمل على تحسين بيئة التطوير بشكل كبير) بهذه الطريقة: تثبيت المكون الإضافي المهبلي vagrant-vbguest سيقوم هذا المكون الإضافي بتثبيت إضافة ضيف box الظاهري على كل ضيف جعلها قابلة للاستخدام أثناء استخدام واجهة virtualbox. ثم لتمكين واجهة المستخدم الرسومية من تحرير Vagrantfile بهذه الطريقة:

config.vm.provider "virtualbox" افعل | vb | vb.gui = النهاية الحقيقية

بدلاً من ذلك لتسريع أداء المجلد المشترك ، أقترح استخدام rsync: config.vm.synced_folder "./git" ، "/ home/vagrant/git" ، اكتب: "rsync" ، rsync__exclude: ".git /" في هذا الطريقة التي يتم بها تحرير التعليمات البرمجية المصدر على المضيف ثم rsync-ed للضيف.

3
Saverio Ferrara