Vagrant для проекту Java: чи потрібно компілювати у віртуальній машині або на хості?


92

Ось питання: Коли ви використовуєте Vagrant для проекту Java (або будь-якого компільованого мовного проекту з цього приводу), чи слід вам компілювати у віртуальній машині або на хості? Крім того, чи хотіли б ви, щоб ваша IDE та всі ваші інструменти розробки також працювали з віртуальної машини або на хості?

Здається, не дуже чітко визначено , як Java IDE та процес компіляції / розгортання працюють з VM Vagrant. Як правило, я складаю враження, що код редагується на хості та працює на віртуальній машині, що чудово працює для некомпільованих мов. Інші відповіді на Stackoverflow передбачають, що Vagrant менш корисний для компільованих мов через додатковий крок компіляції, але я все одно хочу побачити, що можна зробити.

Деякі речі я вже продумав:

Навіщо компілювати на ВМ

  • якщо компілюється на хості, java - це ще одна частина програмного забезпечення для встановлення
  • при компіляції на хості, версія Java на хості повинна бути вручну в курсі та на віртуальній машині
  • відповідна версія Java на хості може бути недоступною (скажімо, на Mac)

Навіщо IDE на віртуальній машині

  • більш тісна інтеграція між середовищем та IDE, може використовувати ярлики для запуску програми
  • може підключати налагоджувач для програм Java без віддаленої налагодження (запуск в один крок / налагодження)

Навіщо компілювати на хості

  • швидший час компіляції
  • хочуть зберегти віртуальну машину якомога ближче до того, як виглядає виробництво

Навіщо IDE на хості

  • це правило бродяги - редагувати код на хості та запускати його на віртуальній машині
  • краща продуктивність інтерфейсу (переадресація X та VNC повільні)

Ваші думки: чи слід запускати IDE зсередини віртуальної машини або хосту? Чи слід компілювати зсередини віртуальної машини або хоста?

Відповіді:


61

Після довгих роздумів та експериментів я вирішив, де використовувати Vagrant і як він інтегрується з робочим процесом Java.

Для JavaEE / розгорнутих додатків налаштування веб-сервера та сервера баз даних - це, безумовно, речі, які мають "достатню" складність, щоб гарантувати використання Vagrant. За допомогою двох серверів та безлічі способів їх налаштування конфігурація легко виходить з синхронізації від одного розробника до іншого, викликаючи синдром «працює на моїй машині». Для такого роду програмного забезпечення найкраще працюватиме редагування та компіляція коду на хості та його розгортання на віртуальній машині Vagrant, що імітує ваше виробниче середовище. Папку розгортання веб-сервера можна навіть символічно зв’язати з ціллю компіляції на хості, усунувши необхідність перерозподілу вручну. Тому Vagrant може бути важливою частиною вашого життєвого циклу,

Для окремих програм Java (наприклад, бібліотек чи настільних додатків) історія трохи змінюється. У цьому випадку має сенс редагувати, компілювати та запускати на хост-машині, взагалі уникаючи використання Vagrant. Якщо ви використовуєте одну з великих IDE Java (Eclipse, Netbeans, IntelliJ ...), ви вже встановили Java на машині. На той момент є дуже незначна перевага порівняно із накладними витратами на використання Vagrant, і це лише додає додаткового рівня складності в процесі розробки. Це пов’язано з тим, що до того часу, коли ви зможете редагувати Java за допомогою IDE, ви вже зможете запустити все на хості. Одне питання полягає в тому, що версія Java, необхідна для проекту, може не збігатися з версією, на якій працює IDE на хості. Загалом (сподіваємось) це не надто велика проблема; станом на момент написання статті JDK6 закінчився, а JDK8 ще не випущений (вгадайте, де це залишає нас). Але якщо вам потрібно було запустити кілька версій, ви повинні мати можливість встановити JAVA_HOME на хості за необхідності. Хоча це і вносить додаткову складність, це менш складність, ніж підтримка середовища виконання Vagrant, лише для роботи з проектами, що використовують різні версії Java.

Цікаве питання полягає в тому, що робити з веб-програмами без контейнерів. Чи слід веб-сервер (в даному випадку внутрішній для програми) запускати всередині віртуальної машини, як це було зроблено для зовнішнього веб-сервера? Або запустити на хості, як це було для окремого додатка? Для безконтейнерних веб-додатків немає зовнішнього веб-сервера, про який слід турбуватися, але все ж існує база даних. У цій ситуації ми можемо застосувати гібридний підхід. Запуск веб-програми без контейнерів за своєю суттю те саме, що запуск автономної програми, тому було б ефективно скомпілювати та запустити свій код на хост-машині. Але із залученою базою даних все ще достатньо складності та конфігурації, що має сенс мати сервер баз даних на власній VM Vagrant.

Сподіваємось, це дає розробникам Java, які зацікавлені у Vagrant, деякий контекст щодо того, як ним користуватися.


що стосується хосту ОС Windows і ОС Linux Linux VM, які ваші думки щодо запуску IntelliJ на Linux VM, що працює на хості (Windows) до X11?
Кевін Мередіт,

3
Чудове запитання: я не згадував про це, але провів багато тестувань із запуском IDE у віртуальній машині Vagrant і виявив, що продуктивність була жахливою ... оскільки на натискання меню потрібно було приблизно 12 секунд, щоб відповісти. Я спробував такі речі: вказати більш швидкий шифр, використовувати стиснення для X11 та збільшити обсяг оперативної пам'яті VM, лише щоб отримати час відгуку до 4 секунд, який все ще був непридатним для використання. Тож я думаю, що Vagrant не призначений для роботи з IDE.
Джей

Думаю, вам слід спробувати - я не ввімкнув прискорення VirtualBox 2D, як для хостів Windows (і у мене не було хоста Windows). Інші ідеї продуктивності, які я не зумів спробувати, включають: Повідомляється, що постачальник VMWare має спеціальні графічні оптимізації, може спробувати VRDP, який може мати кращу продуктивність, ніж X11, Сервер NX повинен бути швидшим, ніж X11, і нарешті є спеція - space.org. Якщо ви знайдете щось, що добре працює, надішліть сюди назад, бо я б хотів про це почути!
Джей

2
Я не тестував IntelliJ всередині гостьової ВМ (і, можливо, не дав досвіду колеги з його повільністю в гостьовій системі). Однак я прочитав наступне у "Vagrant - вгору і працює": 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), схоже, аргументує проти компіляції в хост-віртуальній машині, ні?
Кевін Мередіт

4
Цитата згадує «зниження продуктивності важкої всередині віртуальної машини» і не кажучи вже про глобальну втрати продуктивності для господаря, так що я думаю , що контекст тут для виконання / операцій всередині віртуальної машини . У цьому контексті я інтерпретую цю цитату як прогнозування продуктивності, коли виконаний крок компіляції робиться всередині гостя, на відміну від рекомендації компіляції для гостя проти хоста. Чи можете ви сказати більше про контекст цієї цитати? Чи спеціально книга розглядає цей сценарій? Звичайно, все це підлягає фактичному тестуванню :)
Джей

3

Я цікавився цією темою протягом останнього року :)

Моє рішення полягає в тому, щоб бродяча машина налаштовувалась прапорами. Наприклад, один із цього прапора дозволяє графічний інтерфейс робочого столу, оскільки деякі розробники воліють кодувати на головній машині, тоді як інші воліють мати набагато інтегрованіше середовище з робочим столом та IDE в ньому.

Щоб зіткнутися з повільністю робочого столу, вам слід встановити дуже корисний плагін vagrant (так ... vagrant має плагіни, які значно покращують середовище розробки) таким чином: vagrant plugin install vagrant-vbguest Цей плагін встановить віртуальний додаток гостя для кожного гостя до зробити його придатним під час використання інтерфейсу virtualbox. Потім, щоб увімкнути графічний інтерфейс редагувати файл Vagrant таким чином:

config.vm.provider "virtualbox" do | vb | vb.gui = справжній кінець

Замість того, щоб пришвидшити роботу спільних папок, я пропоную використовувати rsync: config.vm.synced_folder "./git", "/ home / vagrant / git", введіть: "rsync", rsync__exclude: ".git /" У цьому спосіб редагування вихідного коду на хості, а потім rsync-ed для гостя.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.