95

问题来了:当将 Vagrant 用于 Java 项目(或任何已编译的语言项目)时,你应该在 VM 中编译还是在主机上编译?此外,您是否希望您的 IDE 和所有开发工具也从 VM 内部运行,还是在主机上运行?

Java IDE 和编译/部署过程如何与 Vagrant VM 一起工作似乎并没有很好地定义。一般来说,我的印象是代码在主机上编辑,并在 VM 上运行,这对于非编译语言非常有用。Stackoverflow 上的其他答案暗示,由于额外的编译步骤,Vagrant 对编译语言的用处不大,但我仍然想看看可以做什么。

我已经考虑过的一些事情:

为什么要在 VM 上编译

  • 如果在主机上编译,java 是另一个需要安装的软件
  • 如果在主机上编译,主机上的 java 版本必须手动保持与 VM 上的最新版本
  • 主机上相应的 java 版本可能不可用(例如,在 Mac 上)

为什么在 VM 上有 IDE

  • 环境和IDE之间更紧密的集成,可以使用快捷方式来运行应用程序
  • 无需远程调试即可连接Java应用程序的调试器(一步运行/调试)

为什么要在主机上编译

  • 更快的编译时间
  • 希望使 VM 尽可能接近生产的样子

为什么主机上有IDE

  • 在主机上编辑代码并在 VM 上运行它是 vagrant 约定
  • 更好的 UI 性能(X 转发和 VNC 很慢)

你有什么想法:我应该从虚拟机还是主机内部运行我的 IDE?我应该从 VM 内部还是主机内部编译?

4

2 回答 2

62

经过大量的思考和实验,我决定在哪里使用 Vagrant 以及它如何与 Java 开发工作流集成。

对于 JavaEE / 部署的应用程序,配置 Web 服务器和数据库服务器绝对是具有“足够”复杂性以保证使用 Vagrant 的事情。使用两台服务器和无数种配置它们的方法,配置很容易从一个开发人员到另一个开发人员不同步,从而导致“在我的机器上工作”综合症。对于这类软件,最好在主机上编辑和编译代码,然后部署到模拟生产环境的 Vagrant VM 上。Web 服务器的部署文件夹甚至可以符号链接到主机上的编译目标,从而无需手动重新部署。所以 Vagrant 可能是你开发生命周期的重要组成部分,

对于独立的 Java 应用程序(如库或桌面应用程序),情况会发生一些变化。在这种情况下,在主机上编辑、编译和运行是最有意义的,完全避免使用 Vagrant。如果您使用的是大型 Java IDE(Eclipse、Netbeans、IntelliJ...)之一,那么您已经在机器上安装了 Java。在这一点上,与使用 Vagrant 的开销相比几乎没有什么优势,而且只会在您的开发过程中增加一层额外的复杂性。这是因为当您能够使用 IDE 编辑 Java 时,您无论如何都可以在主机上运行所有内容。一个问题是项目所需的 Java 版本可能与主机上运行 IDE 的版本不匹配。总的来说(希望)这不是什么大问题。在撰写本文时,JDK6 已停产,而 JDK8 尚未发布(猜猜我们会在哪里)。但是如果您确实需要运行多个版本,您应该能够根据需要在主机上设置 JAVA_HOME。尽管这确实引入了额外的复杂性,但它比维护 Vagrant 运行时要简单地处理使用不同版本 Java 的项目。

有趣的问题是如何处理无容器 Web 应用程序。Web 服务器(在这种情况下是应用程序内部的)是否应该像我们对外部 Web 服务器那样在 VM 内运行?还是像我们为独立应用程序所做的那样在主机上运行?对于无容器 Web 应用程序,无需担心外部 Web 服务器,但仍有可能存在数据库。在这种情况下,我们可以采取混合方法。运行无容器 Web 应用程序本质上与运行独立应用程序相同,因此在主机上编译和运行代码会很有效。但是在涉及数据库的情况下,仍然存在足够的复杂性和配置,因此将数据库服务器放在自己的 Vagrant VM 上是有意义的。

希望这能为对 Vagrant 感兴趣的 Java 开发人员提供一些关于如何使用它的上下文。

于 2013-07-26T09:41:42.063 回答
3

去年我对这个话题很感兴趣:)

我的解决方案是拥有一台可配置标志的 vagrant 机器。例如,此标志之一启用桌面 gui,因为一些开发人员更喜欢在主机上编写代码,而另一些开发人员更喜欢在桌面和 IDE 中拥有更加集成的环境。

要面对桌面缓慢,你应该安装一个非常有用的 vagrant 插件(是的...... vagrant 有插件可以大大改善开发环境): vagrant plugin install vagrant-vbguest 这个插件将在每个客人上安装虚拟盒子客人添加到使其在使用 virtualbox 界面时可用。然后启用 gui 以这种方式编辑 Vagrantfile:

config.vm.provider "virtualbox" 做 |vb| vb.gui = 真结束

为了加快共享文件夹的性能,我建议使用 rsync: config.vm.synced_folder "./git", "/home/vagrant/git", type: "rsync", rsync__exclude: ".git/" 在这个源代码在主机上编辑然后rsync-ed到来宾的方式。

于 2016-02-08T09:21:23.570 回答