web-dev-qa-db-fra.com

Vagrant pour un projet Java: devez-vous compiler dans le VM ou sur l'hôte?

Voici la question: lorsque vous utilisez Vagrant pour un projet Java (ou tout autre projet de langage compilé d'ailleurs), devez-vous compiler dans le VM ou sur l'hôte? De plus, voudriez-vous que votre IDE et tous vos outils de développement soient également exécutés depuis l'intérieur du VM ou sur l'hôte?

Cela semble être pas très bien défini exactement comment un Java IDE 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 langues non compilées. Autres réponses sur Stackoverflow ont laissé entendre que Vagrant est moins utile pour les langues compilées en raison de l'étape de compilation supplémentaire, mais je veux toujours voir ce qui peut être fait.

J'ai déjà réfléchi à certaines choses:

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 machine virtuelle
  • la version Java correspondante sur l'hôte peut ne pas être disponible (par exemple, sur un Mac)

Pourquoi avoir [IDE sur la machine virtuelle

  • une 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 le VM aussi proche que possible de la production

Pourquoi avoir [IDE sur l'hôte

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

Que pensez-vous: dois-je exécuter mon IDE depuis l'intérieur du VM ou l'hôte? Dois-je compiler depuis l'intérieur de VM ou l'hôte?

91
Jay

Après mûre réflexion et expérimentation, j'ai décidé où utiliser Vagrant et comment il s'intègre au workflow de développement Java Java).

Pour les applications JavaEE/déployées, la configuration d'un serveur Web et d'un serveur de base de données sont certainement des choses qui ont une complexité "suffisante" pour justifier l'utilisation de Vagrant. Avec deux serveurs et les innombrables façons de les configurer, il est facile pour la configuration de se désynchroniser d'un développeur à un autre, provoquant le syndrome "fonctionne 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 un Vagrant VM qui imite votre environnement de production. Le dossier de déploiement du serveur Web pourrait même être lié à une cible de compilation sur l'hôte, supprimant le besoin de redéploiement manuel. Vagrant pourrait donc être une partie importante de votre cycle de vie de développement, mais le temps de cycle pour le code/compiler/déployer à partir de l'hôte et s'exécuter sur le VM with Java serait plus long que le temps de cycle pour le code sur l'hôte et exécuté sur le VM que nous voyons avec PHP/Ruby)/Node/etc.

Pour les applications autonomes Java (comme les bibliothèques ou les applications de bureau), l'histoire change un peu. Dans ce cas, il est plus judicieux de modifier, de compiler et d'exécuter sur la machine hôte, en évitant l'utilisation de Vagrant tout à fait. Si vous utilisez l'un des gros Java IDE (Eclipse, Netbeans, IntelliJ ...), vous avez déjà Java installé sur le À ce stade, il y a très peu d'avantages par rapport à la surcharge d'utilisation de Vagrant, et ne sert qu'à mettre une couche supplémentaire de complexité dans 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 le IDE sur l'hôte. En général (espérons-le) ce n'est pas trop un problème; à ce jour, JDK6 est en fin de vie et JDK8 n'est pas encore sorti (devinez où cela nous mène.) Mais si vous aviez besoin de courir m Dans plusieurs versions, vous devriez pouvoir définir Java_HOME sur l'hôte selon vos besoins. Bien que cela introduise une complexité supplémentaire, c'est moins de complexité que de maintenir un runtime Vagrant uniquement 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 du VM comme nous l'avons fait pour le serveur Web externe? Ou s'exécuter sur l'hôte comme nous l'avons fait pour l'application autonome? Pour applications Web sans conteneur, il n'y a pas de serveur Web externe à s'inquiéter, mais il y a probablement une base de données. Dans cette situation, nous pouvons adopter une approche hybride. L'exécution d'une application Web sans conteneur est essentiellement la même chose que l'exécution d'une application autonome. être efficace pour compiler et 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 Java qui sont intéressés par Vagrant un peu de contexte sur la façon de l’utiliser.

60
Jay

Je me suis intéressé à ce sujet au cours de la dernière année :)

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 le IDE dedans).

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: le plugin vagrant installe vagrant-vbguest Ce plugin installera l'addition d'invité de boîte virtuelle sur chaque invité le rendre 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" do | vb | vb.gui = vraie fin

Au lieu d'accélérer les performances des dossiers partagés, je suggère d'utiliser rsync: config.vm.synced_folder "./git", "/ home/vagrant/git", tapez: "rsync", rsync__exclude: ".git /" Dans ce façon dont le code source est modifié sur l'hôte, puis rsync-ed sur l'invité.

3
Saverio Ferrara