Vagrant pour un projet Java: faut-il compiler dans la VM ou sur l'hôte?

92

Voici la question: lorsque vous utilisez Vagrant pour un projet Java (ou tout autre projet de langage compilé d'ailleurs), devez-vous compiler dans la VM ou sur l'hôte? Souhaitez-vous également que votre IDE et tous vos outils de développement soient également exécutés à partir de la machine virtuelle ou de l'hôte?

Il ne semble pas très bien défini comment un IDE Java et le processus de compilation / déploiement fonctionnent avec une VM Vagrant. En général, j'ai l'impression que le code est édité sur l'hôte et exécuté sur la machine virtuelle, ce qui fonctionne très bien pour les langages non compilés. D'autres réponses sur Stackoverflow ont laissé entendre que Vagrant est moins utile pour les langages compilés en raison de l'étape de compilation supplémentaire, mais je veux toujours voir ce qui peut être fait.

Certaines choses auxquelles j'ai déjà réfléchi:

Pourquoi compiler sur la VM

  • si vous compilez sur l'hôte, java est un autre logiciel à installer
  • en cas de compilation sur l'hôte, la version java sur l'hôte doit être mise à jour manuellement avec celle de la VM
  • la version java correspondante sur l'hôte peut être indisponible (par exemple, sur un Mac)

Pourquoi avoir IDE sur la VM

  • intégration plus étroite entre l'environnement et l'IDE, peut utiliser des raccourcis pour exécuter l'application
  • peut connecter le débogueur pour les applications java sans débogage à distance (exécution / débogage en une étape)

Pourquoi compiler sur l'hôte

  • temps de compilation plus rapides
  • veulent garder la VM aussi proche que possible de ce à quoi ressemble la production

Pourquoi avoir IDE sur l'hôte

  • c'est la convention vagrant de modifier le code sur l'hôte et de l'exécuter sur la VM
  • meilleures performances de l'interface utilisateur (le transfert X et le VNC sont lents)

Que pensez-vous: dois-je exécuter mon IDE à partir de la VM ou de l'hôte? Dois-je compiler à partir de la machine virtuelle ou de l'hôte?

Geai
la source

Réponses:

61

Après beaucoup de réflexion et d'expérimentation, j'ai décidé où utiliser Vagrant et comment il s'intègre au flux de travail de développement Java.

Pour les applications JavaEE / déployées, la configuration d'un serveur Web et d'un serveur de base de données est certainement des choses qui ont "suffisamment" de complexité pour justifier l'utilisation de Vagrant. Avec deux serveurs et la myriade de façons de les configurer, il est facile pour la configuration de se désynchroniser d'un développeur à un autre, provoquant le syndrome du «travail sur ma machine». Pour ce type de logiciel, il serait préférable de modifier et de compiler le code sur l'hôte, et de le déployer sur une VM Vagrant qui imite votre environnement de production. Le dossier de déploiement pour le serveur Web pourrait même être lié symboliquement à une cible de compilation sur l'hôte, supprimant ainsi le besoin de redéployer manuellement. Vagrant pourrait donc être une partie importante de votre cycle de vie de développement,

Pour les applications Java autonomes (comme les bibliothèques ou les applications de bureau), l'histoire change un peu. Dans ce cas, il est plus logique d'éditer, de compiler et d'exécuter sur la machine hôte, en évitant complètement l'utilisation de Vagrant. Si vous utilisez l'un des gros IDE Java (Eclipse, Netbeans, IntelliJ ...), vous avez déjà installé Java sur la machine. À ce stade, il y a très peu d'avantages par rapport à la surcharge d'utilisation de Vagrant, et ne sert qu'à ajouter une couche supplémentaire de complexité à votre processus de développement. En effet, au moment où vous êtes en mesure de modifier Java avec un IDE, vous pouvez quand même tout exécuter sur l'hôte. Un problème est que la version de Java requise pour le projet peut ne pas correspondre à la version exécutant l'EDI sur l'hôte. En général (espérons-le) ce n'est pas trop un problème; au moment d'écrire ces lignes, JDK6 est en fin de vie et JDK8 n'est pas encore sorti (devinez où cela nous laisse). Mais si vous avez besoin d'exécuter plusieurs versions, vous devriez pouvoir définir JAVA_HOME sur l'hôte selon vos besoins. Bien que cela introduit une complexité supplémentaire, il est moins complexe que de maintenir un environnement d'exécution Vagrant juste pour travailler avec des projets utilisant différentes versions de Java.

La question intéressante est de savoir quoi faire avec les applications Web sans conteneur. Le serveur Web (dans ce cas interne à l'application) doit-il être exécuté à l'intérieur de la VM comme nous l'avons fait pour le serveur Web externe? Ou exécuter sur l'hôte comme nous l'avons fait pour l'application autonome? Pour les applications Web sans conteneur, il n'y a pas de serveur Web externe à s'inquiéter, mais il y a encore probablement une base de données. Dans cette situation, nous pouvons adopter une approche hybride. L'exécution d'une application Web sans conteneur revient essentiellement à exécuter une application autonome, il serait donc efficace de compiler et d'exécuter votre code sur la machine hôte. Mais avec une base de données impliquée, il y a encore suffisamment de complexité et de configuration pour qu'il soit logique que le serveur de base de données soit sur sa propre VM Vagrant.

Espérons que cela donne aux développeurs Java intéressés par Vagrant un contexte sur la façon de l'utiliser.

Geai
la source
pour un hôte Windows OS et une machine virtuelle Linux OS, que pensez-vous de l'exécution d'IntelliJ sur la machine virtuelle Linux, exécutée sur l'hôte (Windows) via X11?
Kevin Meredith
3
Excellente question: je ne l'ai pas mentionné mais j'ai fait beaucoup de tests avec l'exécution de l'EDI dans la VM Vagrant, et j'ai trouvé que les performances étaient horribles ... car en cliquant sur un menu, il fallait environ 12 secondes pour répondre. J'ai essayé des choses comme: spécifier un chiffrement plus rapide, utiliser la compression pour X11 et augmenter la RAM vidéo de la VM, uniquement pour obtenir le temps de réponse à 4 secondes, ce qui était encore inutilisable. Je pense donc que Vagrant n'est pas destiné à exécuter un IDE.
Jay
Je pense que vous devriez essayer cependant - je n'ai pas activé l'accélération VirtualBox 2D car c'est pour les hôtes Windows (et je n'avais pas d'hôte Windows). Parmi les autres idées de performances que je n'ai pas pu essayer, citons: le fournisseur de VMWare aurait des optimisations graphiques spéciales, pourrait essayer VRDP qui pourrait avoir de meilleures performances que X11, le serveur NX est censé être plus rapide que X11, et enfin il y a du piquant- space.org. Si vous trouvez quelque chose qui fonctionne bien, veuillez poster ici parce que j'aimerais en entendre parler!
Jay
2
Je n'ai pas testé IntelliJ à l'intérieur d'une VM invitée (et je ne peux pas donner l'expérience d'un collègue avec sa lenteur chez l'invité). Cependant, j'ai lu ce qui suit dans '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.La déclaration de ce livre (écrite par le créateur de Vagrant) semble plaider contre la compilation dans la VM hôte, non?
Kevin Meredith
4
La citation mentionne "une forte pénalité de performances au sein de la machine virtuelle" et ne mentionne pas de pénalité de performances globales pour l'hôte, donc je pense que le contexte ici est pour les performances / opérations à l'intérieur de la VM . Dans ce contexte, j'interprète cette citation comme une prédiction des performances lorsqu'une étape de compilation est effectuée à l'intérieur de l'invité, par opposition à la recommandation de la compilation sur l'invité par rapport à l'hôte. Pouvez-vous nous en dire plus sur le contexte de cette citation? Le livre traite-t-il spécifiquement de ce scénario? Bien sûr, tout cela est soumis à des tests réels :)
Jay
3

J'étais intéressé par ce sujet l'année dernière :)

Ma solution est d'avoir une machine vagabonde configurable avec des drapeaux. Par exemple, l'un de ces indicateurs active l'interface graphique du bureau car certains développeurs préfèrent coder sur la machine hôte tandis que d'autres préfèrent avoir un environnement beaucoup plus intégré avec le bureau et l'EDI.

Pour faire face à la lenteur du bureau, vous devez installer un plugin vagrant très utile (ouais ... vagrant a des plugins qui améliorent considérablement l'environnement de développement) de cette manière: vagrant plugin install vagrant-vbguest Ce plugin installera l'ajout d'invité de boîte virtuelle sur chaque invité pour rendez-le utilisable lors de l'utilisation de l'interface virtualbox. Ensuite, pour activer l'interface graphique, modifiez le fichier Vagrant de cette manière:

config.vm.provider "virtualbox" faire | vb | vb.gui = vraie fin

Au lieu d'accélérer les performances du dossier partagé, je suggère d'utiliser rsync: config.vm.synced_folder "./git", "/ home / vagrant / git", tapez: "rsync", rsync__exclude: ".git /" Dans ce manière dont le code source est édité sur l'hôte, puis rsync-ed vers l'invité.

Saverio Ferrara
la source