Gelandangan untuk proyek Java: haruskah Anda mengompilasi di VM atau di host?

92

Inilah pertanyaannya: Saat menggunakan Vagrant untuk proyek Java (atau proyek bahasa terkompilasi dalam hal ini), haruskah Anda mengompilasi di VM atau di host? Selain itu, apakah Anda ingin IDE dan semua alat pengembangan Anda dijalankan dari dalam VM juga, atau di host?

Tampaknya tidak begitu jelas didefinisikan secara tepat bagaimana Java IDE dan proses kompilasi / penerapan bekerja dengan Vagrant VM. Secara umum kesan saya adalah bahwa kode diedit di host, dan dijalankan di VM, yang berfungsi dengan baik untuk bahasa yang tidak dikompilasi. Jawaban lain di Stackoverflow menyiratkan bahwa Vagrant kurang berguna untuk bahasa yang dikompilasi karena langkah kompilasi tambahan, tetapi saya masih ingin melihat apa yang bisa dilakukan.

Beberapa hal yang sudah saya pikirkan:

Mengapa mengkompilasi di VM

  • jika mengkompilasi pada host, java adalah satu lagi perangkat lunak yang harus diinstal
  • jika mengkompilasi pada host, versi java pada host harus selalu diperbarui secara manual dengan versi di VM
  • versi java yang sesuai di host mungkin tidak tersedia (misalnya, di Mac)

Mengapa IDE di VM

  • integrasi yang lebih erat antara lingkungan dan IDE, dapat menggunakan pintasan untuk menjalankan aplikasi
  • dapat menghubungkan debugger untuk aplikasi java tanpa debugging jarak jauh (satu langkah run / debug)

Mengapa mengkompilasi pada host

  • waktu kompilasi lebih cepat
  • ingin menjaga VM sedekat mungkin dengan produksi

Mengapa memiliki IDE di host

  • itu adalah konvensi gelandangan untuk mengedit kode pada host dan menjalankannya di VM
  • kinerja UI yang lebih baik (X forwarding dan VNC lambat)

Apa pendapat Anda: haruskah saya menjalankan IDE saya dari dalam VM atau host? Haruskah saya mengkompilasi dari dalam VM atau host?

Jay
sumber

Jawaban:

61

Setelah banyak berpikir dan bereksperimen, saya telah memutuskan di mana harus menggunakan Vagrant dan bagaimana hal itu terintegrasi dengan alur kerja pengembangan Java.

Untuk JavaEE / aplikasi yang diterapkan, mengkonfigurasi server web dan server database jelas merupakan hal-hal yang memiliki kompleksitas "cukup" untuk menjamin penggunaan Vagrant. Dengan dua server dan berbagai cara untuk mengkonfigurasinya, mudah untuk konfigurasi tidak sinkron dari satu pengembang ke pengembang lainnya, menyebabkan sindrom "bekerja pada mesin saya". Untuk jenis perangkat lunak ini, akan bekerja paling baik untuk mengedit dan mengompilasi kode pada host, dan menerapkannya ke VM Vagrant yang meniru lingkungan produksi Anda. Folder penerapan untuk server web bahkan dapat dihubungkan dengan symlink ke target kompilasi pada host, menghilangkan kebutuhan untuk menerapkan ulang secara manual. Jadi Vagrant bisa menjadi bagian penting dari siklus pengembangan Anda,

Untuk aplikasi Java yang berdiri sendiri (seperti perpustakaan atau aplikasi desktop) ceritanya sedikit berubah. Dalam hal ini, paling masuk akal untuk mengedit, mengkompilasi, dan menjalankan pada mesin host, menghindari penggunaan Vagrant sama sekali. Jika Anda menggunakan salah satu Java IDE yang besar (Eclipse, Netbeans, IntelliJ ...), Anda sudah menginstal Java di mesin. Pada titik itu, ada sedikit keuntungan dibandingkan dengan overhead menggunakan Vagrant, dan hanya berfungsi untuk menempatkan lapisan kompleksitas ekstra dalam proses pengembangan Anda. Ini karena pada saat Anda dapat mengedit Java dengan IDE, Anda tetap dapat menjalankan semuanya di host. Satu masalah adalah bahwa versi Java yang diperlukan untuk proyek tersebut mungkin tidak cocok dengan versi yang menjalankan IDE pada host. Secara umum (mudah-mudahan) ini tidak terlalu menjadi masalah; sampai tulisan ini dibuat, JDK6 sudah habis masa pakainya dan JDK8 belum dirilis (coba tebak di mana kita tinggal). Tetapi jika Anda memang perlu menjalankan beberapa versi, Anda harus dapat menyetel JAVA_HOME di host sesuai kebutuhan. Meskipun hal ini memperkenalkan kompleksitas ekstra, kerumitannya lebih rendah daripada mempertahankan runtime Vagrant hanya untuk bekerja dengan project yang menggunakan versi Java yang berbeda.

Pertanyaan yang menarik adalah apa yang harus dilakukan dengan aplikasi web tanpa kontainer. Haruskah server web (dalam hal ini internal ke aplikasi) dijalankan di dalam VM seperti yang kita lakukan untuk server web eksternal? Atau jalankan di host seperti yang kami lakukan untuk aplikasi mandiri? Untuk aplikasi web tanpa kontainer, tidak ada server web eksternal yang perlu dikhawatirkan, tetapi kemungkinan masih ada basis data. Dalam situasi ini kita dapat mengambil pendekatan hibrid. Menjalankan aplikasi web tanpa kontainer pada dasarnya sama dengan menjalankan aplikasi mandiri, jadi akan efektif untuk mengompilasi dan menjalankan kode Anda di mesin host. Tetapi dengan database yang terlibat masih ada cukup kompleksitas dan konfigurasi di sana sehingga masuk akal untuk memiliki server database di VM Vagrant-nya sendiri.

Semoga ini memberi pengembang Java yang tertarik dengan Vagrant beberapa konteks tentang cara menggunakannya.

Jay
sumber
untuk host OS Windows dan VM OS Linux, apa pendapat Anda tentang menjalankan IntelliJ di VM Linux, berjalan di host (Windows) hingga X11?
Kevin Meredith
3
Pertanyaan bagus: Saya tidak menyebutkannya tetapi saya melakukan banyak pengujian dengan menjalankan IDE di dalam Vagrant VM, dan menemukan bahwa kinerjanya sangat buruk ... karena mengklik menu membutuhkan waktu sekitar 12 detik untuk merespons. Saya mencoba hal-hal seperti: menentukan sandi yang lebih cepat, menggunakan kompresi untuk X11, dan meningkatkan RAM video VM, hanya untuk mendapatkan waktu respons hingga 4 detik yang masih tidak dapat digunakan. Jadi menurut saya, Vagrant tidak dimaksudkan untuk menjalankan IDE.
Jay
Saya pikir Anda harus mencobanya - saya tidak mengaktifkan akselerasi VirtualBox 2D karena itu untuk host Windows (dan saya tidak memiliki host Windows). Ide performa lain yang tidak sempat saya coba antara lain: Penyedia VMWare dikabarkan memiliki pengoptimalan grafis khusus, bisa mencoba VRDP yang mungkin memiliki performa lebih baik dari X11, NX Server seharusnya lebih cepat dari X11, dan akhirnya ada bumbu- space.org. Jika Anda menemukan sesuatu yang bekerja dengan baik, silakan posting kembali di sini karena saya ingin mendengarnya!
Jay
2
Saya belum menguji IntelliJ di dalam VM tamu (dan mungkin tidak memberikan pengalaman rekan kerja dengan kelambatannya dalam tamu). Namun, saya membaca yang berikut di 'Gelandangan - Naik dan Berlari': 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.Pernyataan buku ini (ditulis oleh pencipta Gelandangan) tampaknya menentang kompilasi di VM host, bukan?
Kevin Meredith
4
Kutipan menyebutkan "penalti performa berat dalam mesin virtual" dan tidak menyebutkan penalti performa global untuk host, jadi menurut saya konteksnya di sini adalah untuk performa / operasi di dalam VM . Dalam konteks itu, saya menafsirkan kutipan ini untuk memprediksi kinerja ketika langkah kompilasi dilakukan di dalam tamu daripada merekomendasikan kompilasi pada tamu vs pada tuan rumah. Bisakah Anda menjelaskan lebih lanjut tentang konteks kutipan ini? Apakah buku tersebut membahas skenario ini secara khusus? Tentu saja semua ini tunduk pada pengujian yang sebenarnya :)
Jay
3

Saya tertarik dengan topik ini selama setahun terakhir :)

Solusi saya adalah memiliki mesin gelandangan yang dapat dikonfigurasi dengan bendera. Misalnya, salah satu dari tanda ini mengaktifkan desktop gui karena beberapa pengembang lebih suka membuat kode pada mesin host sementara yang lain lebih suka memiliki lingkungan yang jauh lebih terintegrasi dengan desktop dan IDE di dalamnya.

Untuk menghadapi kelambatan desktop Anda harus menginstal plugin vagrant yang sangat berguna (ya ... vagrant memiliki plugin yang sangat meningkatkan lingkungan pengembangan) dengan cara ini: vagrant plugin install vagrant-vbguest Plugin ini akan menginstal tambahan tamu kotak virtual pada setiap tamu untuk membuatnya dapat digunakan saat menggunakan antarmuka kotak virtual. Kemudian untuk mengaktifkan gui, edit Vagrantfile dengan cara ini:

config.vm.provider "virtualbox" lakukan | vb | vb.gui = benar akhir

Alih-alih untuk mempercepat kinerja folder bersama, saya sarankan untuk menggunakan rsync: config.vm.synced_folder "./git", "/ home / vagrant / git", ketik: "rsync", rsync__exclude: ".git /" Di sini cara kode sumber diedit pada host dan kemudian disinkronkan ke tamu.

Saverio Ferrara
sumber