Vagrant für ein Java-Projekt: Sollten Sie in der VM oder auf dem Host kompilieren?

91

Hier ist die Frage: Wenn Sie Vagrant für ein Java-Projekt (oder ein anderes kompiliertes Sprachprojekt) verwenden, sollten Sie in der VM oder auf dem Host kompilieren? Möchten Sie außerdem, dass Ihre IDE und alle Ihre Entwicklungstools auch innerhalb der VM oder auf dem Host ausgeführt werden?

Es scheint nicht sehr genau definiert zu sein , wie eine Java-IDE und der Kompilierungs- / Bereitstellungsprozess mit einer Vagrant-VM funktionieren. Im Allgemeinen habe ich den Eindruck, dass Code auf dem Host bearbeitet und auf der VM ausgeführt wird, was für nicht kompilierte Sprachen hervorragend geeignet ist. Andere Antworten auf Stackoverflow haben impliziert, dass Vagrant für kompilierte Sprachen aufgrund des zusätzlichen Kompilierungsschritts weniger nützlich ist, aber ich möchte immer noch sehen, was getan werden kann.

Einige Dinge habe ich mir schon überlegt:

Warum auf der VM kompilieren?

  • Beim Kompilieren auf dem Host ist Java eine weitere zu installierende Software
  • Beim Kompilieren auf dem Host muss die Java-Version auf dem Host manuell mit der auf der VM auf dem neuesten Stand gehalten werden
  • Die entsprechende Java-Version auf dem Host ist möglicherweise nicht verfügbar (z. B. auf einem Mac).

Warum IDE auf der VM haben

  • Durch eine engere Integration zwischen Umgebung und IDE können Verknüpfungen zum Ausführen der Anwendung verwendet werden
  • kann den Debugger für Java-Anwendungen ohne Remote-Debugging verbinden (einstufiges Ausführen / Debuggen)

Warum auf dem Host kompilieren

  • schnellere Kompilierungszeiten
  • Ich möchte die VM so nah wie möglich an der Produktion halten

Warum IDE auf dem Host haben

  • Es ist die übliche Konvention, Code auf dem Host zu bearbeiten und auf der VM auszuführen
  • bessere UI-Leistung (X-Weiterleitung und VNC sind langsam)

Was denken Sie: Soll ich meine IDE innerhalb der VM oder des Hosts ausführen? Soll ich aus der VM oder dem Host kompilieren?

Jay
quelle

Antworten:

61

Nach langem Nachdenken und Experimentieren habe ich mich entschieden, wo Vagrant verwendet werden soll und wie es in den Java-Entwicklungsworkflow integriert werden soll.

Für JavaEE / bereitgestellte Anwendungen sind die Konfiguration eines Webservers und eines Datenbankservers definitiv Dinge, die "genug" komplex sind, um die Verwendung von Vagrant zu rechtfertigen. Mit zwei Servern und den unzähligen Möglichkeiten, sie zu konfigurieren, ist es für die Konfiguration einfach, von einem Entwickler zum anderen nicht mehr synchron zu sein, was das Syndrom "Arbeiten auf meinem Computer" hervorruft. Für diese Art von Software ist es am besten, den Code auf dem Host zu bearbeiten und zu kompilieren und auf einer Vagrant-VM bereitzustellen, die Ihre Produktionsumgebung nachahmt. Der Bereitstellungsordner für den Webserver kann sogar mit einem Kompilierungsziel auf dem Host verknüpft werden, sodass keine manuelle erneute Bereitstellung erforderlich ist. Vagrant könnte also ein wichtiger Teil Ihres Entwicklungslebenszyklus sein.

Bei eigenständigen Java-Anwendungen (wie Bibliotheken oder Desktop-Anwendungen) ändert sich die Story etwas. In diesem Fall ist es am sinnvollsten, auf dem Host-Computer zu bearbeiten, zu kompilieren und auszuführen, wobei die Verwendung von Vagrant insgesamt vermieden wird. Wenn Sie eine der großen Java-IDEs (Eclipse, Netbeans, IntelliJ ...) verwenden, ist Java bereits auf dem Computer installiert. Zu diesem Zeitpunkt gibt es im Vergleich zum Aufwand für die Verwendung von Vagrant nur einen sehr geringen Vorteil und dient nur dazu, Ihrem Entwicklungsprozess eine zusätzliche Komplexitätsebene zu verleihen. Dies liegt daran, dass Sie, wenn Sie Java mit einer IDE bearbeiten können, ohnehin alles auf dem Host ausführen können. Ein Problem besteht darin, dass die für das Projekt erforderliche Java-Version möglicherweise nicht mit der Version übereinstimmt, in der die IDE auf dem Host ausgeführt wird. Im Allgemeinen (hoffentlich) ist dies kein allzu großes Problem. Zum jetzigen Zeitpunkt ist JDK6 nicht mehr verfügbar und JDK8 ist noch nicht freigegeben (raten Sie mal, wo uns das zurücklässt). Wenn Sie jedoch mehrere Versionen ausführen mussten, sollten Sie JAVA_HOME nach Bedarf auf dem Host festlegen können. Dies führt zwar zu einer zusätzlichen Komplexität, ist jedoch weniger komplex als die Verwaltung einer Vagrant-Laufzeit, nur um mit Projekten zu arbeiten, die verschiedene Java-Versionen verwenden.

Die interessante Frage ist, was mit containerlosen Webanwendungen zu tun ist. Sollte der Webserver (in diesem Fall anwendungsintern) innerhalb der VM ausgeführt werden, wie wir es für den externen Webserver getan haben? Oder auf dem Host ausführen, wie wir es für die eigenständige Anwendung getan haben? Für containerlose Webanwendungen gibt es keinen externen Webserver, über den Sie sich Sorgen machen müssen, aber es gibt wahrscheinlich immer noch eine Datenbank. In dieser Situation können wir einen hybriden Ansatz verfolgen. Das Ausführen einer containerlosen Webanwendung entspricht im Wesentlichen dem Ausführen einer eigenständigen Anwendung. Daher ist es effektiv, Ihren Code auf dem Hostcomputer zu kompilieren und auszuführen. Bei einer beteiligten Datenbank ist die Komplexität und Konfiguration jedoch immer noch so hoch, dass es sinnvoll ist, den Datenbankserver auf einer eigenen Vagrant-VM zu haben.

Hoffentlich gibt dies Java-Entwicklern, die an Vagrant interessiert sind, einen Kontext zur Verwendung.

Jay
quelle
Was halten Sie von einem Windows OS-Host und einer Linux OS-VM für die Ausführung von IntelliJ auf der Linux-VM, die auf dem Host (Windows) bis X11 ausgeführt wird?
Kevin Meredith
3
Gute Frage: Ich habe es nicht erwähnt, aber ich habe viele Tests mit dem Ausführen der IDE in der Vagrant-VM durchgeführt und festgestellt, dass die Leistung schrecklich war ... da das Klicken auf ein Menü etwa 12 Sekunden dauerte, um zu antworten. Ich habe Dinge wie versucht: Geben Sie eine schnellere Verschlüsselung an, verwenden Sie die Komprimierung für X11 und erhöhen Sie den VM-Video-RAM, um die Antwortzeit auf 4 Sekunden zu bringen, was immer noch unbrauchbar war. Ich denke also, dass Vagrant nicht zum Ausführen einer IDE gedacht ist.
Jay
Ich denke, Sie sollten es versuchen - ich habe die VirtualBox 2D-Beschleunigung nicht aktiviert, da dies für Windows-Hosts gilt (und ich hatte keinen Windows-Host). Andere Leistungsideen, die ich nicht ausprobieren durfte, sind: Es wird gemunkelt, dass der VMWare-Anbieter spezielle Grafikoptimierungen hat, VRDP ausprobieren könnte, das möglicherweise eine bessere Leistung als X11 hat, der NX-Server soll schneller als X11 sein, und schließlich gibt es Gewürz- space.org. Wenn Sie etwas finden, das gut funktioniert, posten Sie es bitte hier zurück, da ich gerne davon hören würde!
Jay
2
Ich habe IntelliJ nicht in einer Gast-VM getestet (und möglicherweise nicht die Erfahrungen eines Kollegen mit seiner Langsamkeit im Gast angegeben). In 'Vagrant - Up and Running' habe ich jedoch Folgendes gelesen: 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.Die Aussage dieses Buches (geschrieben von Vagrant Creator) scheint gegen die Kompilierung in der Host-VM zu sprechen, nicht wahr?
Kevin Meredith
4
Das Zitat erwähnt "eine hohe Leistungseinbuße innerhalb der virtuellen Maschine" und erwähnt keine globale Leistungsbeeinträchtigung für den Host. Ich denke, der Kontext hier ist für die Leistung / den Betrieb innerhalb der VM . In diesem Zusammenhang interpretiere ich dieses Zitat so, dass die Leistung vorhergesagt wird, wenn ein Kompilierungsschritt innerhalb des Gastes ausgeführt wird, anstatt eine Kompilierung für den Gast im Vergleich zum Host zu empfehlen. Können Sie mehr über den Kontext für dieses Zitat sagen? Befasst sich das Buch speziell mit diesem Szenario? Natürlich unterliegt dies alles tatsächlichen Tests :)
Jay
3

Ich habe mich im letzten Jahr für dieses Thema interessiert :)

Meine Lösung besteht darin, eine Vagabundmaschine mit Flags konfigurierbar zu haben. Zum Beispiel aktiviert eines dieser Flags die Desktop-GUI, da einige Entwickler lieber auf dem Host-Computer codieren, während andere eine viel stärker integrierte Umgebung mit dem Desktop und der IDE bevorzugen.

Um der Langsamkeit des Desktops zu begegnen, sollten Sie ein sehr nützliches Vagrant-Plugin (ja ... Vagrant hat Plugins, die die Entwicklungsumgebung erheblich verbessern) folgendermaßen installieren: Vagrant-Plugin install vagrant-vbguest Dieses Plugin installiert die virtuelle Box als Gastzusatz für jeden Gast Machen Sie es während der Verwendung der Virtualbox-Schnittstelle verwendbar. Um die GUI zu aktivieren, bearbeiten Sie die Vagrant-Datei folgendermaßen:

config.vm.provider "virtualbox" do | vb | vb.gui = wahres Ende

Um die Leistung des freigegebenen Ordners zu beschleunigen, empfehle ich, rsync: config.vm.synced_folder "./git", "/ home / vagrant / git" zu verwenden. Geben Sie Folgendes ein: "rsync", rsync__exclude: ".git /" So wird der Quellcode auf dem Host bearbeitet und dann mit dem Gast synchronisiert.

Saverio Ferrara
quelle