Vagrant สำหรับโปรเจ็กต์ Java: คุณควรคอมไพล์ใน VM หรือบนโฮสต์?


92

นี่คือคำถาม: เมื่อใช้ Vagrant สำหรับโปรเจ็กต์ Java (หรือโปรเจ็กต์ภาษาที่คอมไพล์สำหรับเรื่องนั้น) คุณควรคอมไพล์ใน VM หรือบนโฮสต์? นอกจากนี้คุณต้องการให้ IDE และเครื่องมือการพัฒนาทั้งหมดของคุณทำงานจากภายใน VM ด้วยหรือบนโฮสต์?

ดูเหมือนว่าจะไม่ได้กำหนดไว้อย่างชัดเจนว่า Java IDE และกระบวนการคอมไพล์ / ปรับใช้ทำงานร่วมกับ Vagrant VM อย่างไร โดยทั่วไปความประทับใจของฉันคือโค้ดถูกแก้ไขบนโฮสต์และทำงานบน VM ซึ่งใช้งานได้ดีสำหรับภาษาที่ไม่ได้คอมไพล์ คำตอบอื่น ๆ ใน Stackoverflowบอกเป็นนัยว่า Vagrant มีประโยชน์น้อยกว่าสำหรับภาษาที่คอมไพล์เนื่องจากมีขั้นตอนการคอมไพล์เพิ่มเติม แต่ฉันยังต้องการดูสิ่งที่สามารถทำได้

บางสิ่งที่ฉันเคยคิดไว้แล้ว:

ทำไมต้องคอมไพล์บน VM

  • หากคอมไพล์บนโฮสต์ java เป็นซอฟต์แวร์อีกหนึ่งชิ้นที่จะติดตั้ง
  • หากคอมไพล์บนโฮสต์เวอร์ชัน java บนโฮสต์จะต้องได้รับการอัปเดตด้วยตัวเองบน VM
  • เวอร์ชันจาวาที่เกี่ยวข้องบนโฮสต์อาจไม่พร้อมใช้งาน (เช่นบน Mac)

เหตุใดจึงมี IDE บน VM

  • บูรณาการที่เข้มงวดมากขึ้นระหว่างสภาพแวดล้อมและ IDE สามารถใช้ทางลัดเพื่อเรียกใช้แอปพลิเคชัน
  • สามารถเชื่อมต่อดีบักเกอร์สำหรับแอปพลิเคชัน java โดยไม่ต้องมีการดีบักระยะไกล

ทำไมต้องคอมไพล์บนโฮสต์

  • เวลาคอมไพล์เร็วขึ้น
  • ต้องการให้ VM ใกล้เคียงกับการผลิตมากที่สุด

ทำไมต้องมี IDE บนโฮสต์

  • มันเป็นแบบแผนของคนเร่ร่อนในการแก้ไขโค้ดบนโฮสต์และเรียกใช้บน VM
  • ประสิทธิภาพ UI ที่ดีขึ้น (การส่งต่อ X และ VNC ช้า)

คุณคิดอย่างไร: ฉันควรเรียกใช้ IDE จากภายใน VM หรือโฮสต์ ฉันควรคอมไพล์จากภายใน VM หรือโฮสต์?

คำตอบ:


61

หลังจากใช้ความคิดและการทดลองมากมายฉันตัดสินใจว่าจะใช้ Vagrant ที่ไหนและจะรวมเข้ากับเวิร์กโฟลว์การพัฒนา Java ได้อย่างไร

สำหรับ JavaEE / แอปพลิเคชันที่ปรับใช้การกำหนดค่าเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ฐานข้อมูลเป็นสิ่งที่มีความซับซ้อน "เพียงพอ" ที่จะรับประกันการใช้ Vagrant ด้วยเซิร์ฟเวอร์สองเครื่องและวิธีกำหนดค่ามากมายทำให้การกำหนดค่าไม่ตรงกันจากผู้พัฒนารายหนึ่งไปยังอีกรายหนึ่งทำให้เกิดอาการ "ทำงานบนเครื่องของฉัน" ได้อย่างง่ายดาย สำหรับซอฟต์แวร์ประเภทนี้การแก้ไขและคอมไพล์โค้ดบนโฮสต์จะทำงานได้ดีที่สุดและปรับใช้กับ Vagrant VM ที่เลียนแบบสภาพแวดล้อมการผลิตของคุณ โฟลเดอร์การปรับใช้สำหรับเว็บเซิร์ฟเวอร์อาจเชื่อมโยงกับเป้าหมายการคอมไพล์บนโฮสต์ทำให้ไม่จำเป็นต้องปรับใช้ใหม่ด้วยตนเอง ดังนั้น Vagrant อาจเป็นส่วนสำคัญของวงจรการพัฒนาของคุณ

สำหรับแอปพลิเคชัน Java แบบสแตนด์อโลน (เช่นไลบรารีหรือแอปพลิเคชันเดสก์ท็อป) เรื่องราวจะเปลี่ยนไปเล็กน้อย ในกรณีนี้การแก้ไขคอมไพล์และรันบนเครื่องโฮสต์จึงเหมาะสมที่สุดโดยละเว้นการใช้ Vagrant โดยสิ้นเชิง หากคุณใช้ Java IDE ขนาดใหญ่ (Eclipse, Netbeans, IntelliJ ... ) แสดงว่าคุณได้ติดตั้ง Java ไว้ในเครื่องแล้ว ณ จุดนั้นมีข้อได้เปรียบน้อยมากเมื่อเทียบกับค่าใช้จ่ายในการใช้ Vagrant และทำหน้าที่เพิ่มความซับซ้อนอีกชั้นในกระบวนการพัฒนาของคุณเท่านั้น เนื่องจากเมื่อคุณสามารถแก้ไข Java ด้วย IDE ได้คุณจะสามารถรันทุกอย่างบนโฮสต์ได้ ปัญหาหนึ่งคือเวอร์ชันของ Java ที่จำเป็นสำหรับโปรเจ็กต์อาจไม่ตรงกับเวอร์ชันที่รัน IDE บนโฮสต์ โดยทั่วไป (หวังว่า) นี่จะไม่เป็นปัญหามากเกินไป เนื่องจากการเขียนนี้ JDK6 สิ้นสุดอายุการใช้งานและ JDK8 ยังไม่ออก (เดาว่าจะทิ้งเราไปไหน) แต่ถ้าคุณไม่จำเป็นต้องรันหลายเวอร์ชันคุณควรตั้งค่า JAVA_HOME บนโฮสต์ได้ตามต้องการ แม้ว่าสิ่งนี้จะทำให้เกิดความซับซ้อนเป็นพิเศษ แต่ก็มีความซับซ้อนน้อยกว่าการดูแลรันไทม์ของ Vagrant เพียงเพื่อทำงานกับโปรเจ็กต์ที่ใช้ Java เวอร์ชันต่างๆ

คำถามที่น่าสนใจคือจะทำอย่างไรกับเว็บแอปพลิเคชันแบบไม่ใช้คอนเทนเนอร์ ควรรันเว็บเซิร์ฟเวอร์ (ในกรณีนี้ภายในแอปพลิเคชัน) ภายใน VM เหมือนที่เราทำกับเว็บเซิร์ฟเวอร์ภายนอกหรือไม่ หรือรันบนโฮสต์เหมือนที่เราทำกับแอปพลิเคชันแบบสแตนด์อโลน? สำหรับเว็บแอปพลิเคชันแบบไม่ใช้คอนเทนเนอร์ไม่มีเว็บเซิร์ฟเวอร์ภายนอกที่ต้องกังวล แต่ยังมีฐานข้อมูลอยู่ ในสถานการณ์เช่นนี้เราสามารถใช้แนวทางแบบผสมผสาน การเรียกใช้แอปพลิเคชันเว็บแบบไม่ใช้คอนเทนเนอร์โดยพื้นฐานแล้วจะเหมือนกับการเรียกใช้แอปพลิเคชันแบบสแตนด์อโลนดังนั้นการคอมไพล์และรันโค้ดของคุณบนเครื่องโฮสต์จะมีประสิทธิภาพ แต่ด้วยฐานข้อมูลที่เกี่ยวข้องยังมีความซับซ้อนและการกำหนดค่าเพียงพอที่จะให้เซิร์ฟเวอร์ฐานข้อมูลอยู่ใน Vagrant VM ของตัวเอง

หวังว่าสิ่งนี้จะช่วยให้นักพัฒนา Java ที่สนใจ Vagrant มีบริบทเกี่ยวกับวิธีการใช้งาน


สำหรับโฮสต์ Windows OS และ Linux OS VM คุณคิดอย่างไรกับการเรียกใช้ IntelliJ บน Linux VM ที่ทำงานบนโฮสต์ (Windows) ผ่าน X11
Kevin Meredith

3
คำถามที่ดี: ฉันไม่ได้พูดถึงมัน แต่ฉันได้ทำการทดสอบหลายครั้งโดยใช้ IDE ใน Vagrant VM และพบว่าประสิทธิภาพนั้นแย่มาก ... เนื่องจากในการคลิกที่เมนูใช้เวลาประมาณ 12 วินาทีในการตอบสนอง ฉันลองสิ่งต่างๆเช่นระบุรหัสที่เร็วขึ้นใช้การบีบอัดสำหรับ X11 และเพิ่ม RAM วิดีโอ VM เพียงเพื่อให้ได้เวลาตอบสนองเป็น 4 วินาทีซึ่งยังใช้ไม่ได้ ดังนั้นความคิดของฉันคือ Vagrant ไม่ได้มีไว้สำหรับการเรียกใช้ IDE
Jay

ฉันคิดว่าคุณควรลองดู - ฉันไม่ได้เปิดใช้งานการเร่งความเร็ว VirtualBox 2D สำหรับโฮสต์ Windows (และฉันไม่มีโฮสต์ Windows) แนวคิดประสิทธิภาพอื่น ๆ ที่ฉันไม่ได้ลองรวมถึง: ผู้ให้บริการของ VMWare มีข่าวลือว่ามีการเพิ่มประสิทธิภาพกราฟิกพิเศษสามารถลองใช้ VRDP ซึ่งอาจมีประสิทธิภาพดีกว่า X11 เซิร์ฟเวอร์ NX ควรจะเร็วกว่า X11 และในที่สุดก็มีเครื่องเทศ - space.org หากคุณพบสิ่งใดที่ใช้งานได้ดีโปรดโพสต์ที่นี่เพราะฉันชอบที่จะได้ยินเกี่ยวกับเรื่องนี้!
Jay

2
ฉันยังไม่ได้ทดสอบ IntelliJ ภายในแขก VM (และอาจไม่ได้รับประสบการณ์ของเพื่อนร่วมงานเกี่ยวกับความช้าในแขก) อย่างไรก็ตามฉันอ่านสิ่งต่อไปนี้ใน 'Vagrant - Up and Running': Shared folders incur a heavy performance penalty within the virtual machine when there is heavy I/ O, so they should only be used for source files. Any compilation step, database files, and so on should be done outside the shared folder filesystem inside the guest filesystem itself.คำแถลงของหนังสือเล่มนี้ (เขียนโดยผู้สร้าง Vagrant) ดูเหมือนจะโต้แย้งกับการรวบรวมในโฮสต์ VM ไม่ใช่หรือ?
Kevin Meredith

4
อ้างระบุว่า "ลงโทษประสิทธิภาพหนักภายในเครื่องเสมือน" และไม่ได้พูดถึงการลงโทษประสิทธิภาพระดับโลกสำหรับการโฮสต์ดังนั้นฉันคิดว่าบริบทที่นี่เป็นสำหรับการทำงาน / การดำเนินงานภายใน VM ในบริบทนั้นฉันตีความว่าคำพูดนี้เป็นการทำนายประสิทธิภาพเมื่อขั้นตอนการรวบรวมเสร็จสิ้นภายในแขกแทนที่จะแนะนำให้รวบรวมแขกกับบนโฮสต์ คุณสามารถพูดเพิ่มเติมเกี่ยวกับบริบทของคำพูดนี้ได้ไหม หนังสือเล่มนี้กล่าวถึงสถานการณ์นี้โดยเฉพาะหรือไม่ แน่นอนทั้งหมดนี้ขึ้นอยู่กับการทดสอบจริง :)
Jay

3

ฉันสนใจหัวข้อนี้ในช่วงปีที่แล้ว :)

วิธีแก้ปัญหาของฉันคือการกำหนดค่าเครื่องพเนจรด้วยแฟล็ก ตัวอย่างเช่นหนึ่งในแฟล็กนี้เปิดใช้งานเดสก์ท็อป gui เนื่องจากนักพัฒนาบางรายต้องการโค้ดบนเครื่องโฮสต์ในขณะที่คนอื่นต้องการให้มีสภาพแวดล้อมรวมกับเดสก์ท็อปและ IDE ที่อยู่ในนั้นมากกว่า

หากต้องการเผชิญกับความช้าของเดสก์ท็อปคุณควรติดตั้งปลั๊กอินคนจรจัดที่มีประโยชน์มาก (ใช่ ... vagrant มีปลั๊กอินที่ปรับปรุงสภาพแวดล้อมการพัฒนาอย่างมาก) ด้วยวิธีนี้ปลั๊กอินคนจรจัดติดตั้ง vagrant-vbguest ปลั๊กอินนี้จะติดตั้งการเพิ่มกล่องเสมือนสำหรับแขกทุกคน ทำให้ใช้งานได้ในขณะที่ใช้อินเทอร์เฟซ virtualbox จากนั้นเพื่อเปิดใช้งาน gui แก้ไข Vagrantfile ด้วยวิธีนี้:

config.vm.provider "virtualbox" ทำ | vb | vb.gui = จุดจบที่แท้จริง

แทนที่จะเร่งการแสดงโฟลเดอร์ที่แชร์ฉันขอแนะนำให้ใช้ rsync: config.vm.synced_folder "./git", "/ home / vagrant / git" ให้พิมพ์: "rsync", rsync__exclude: ".git /" ในนี้ วิธีแก้ไขซอร์สโค้ดบนโฮสต์แล้ว rsync-ed ให้กับแขก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.