一个Java项目使用Vagrant:你应该在虚拟机中编译还是在主机上编译?

96
这是问题:在使用Vagrant进行Java项目(或任何编译语言项目)时,应该在虚拟机中还是在主机上编译?此外,您是否希望将IDE和所有开发工具也在虚拟机内运行,还是在主机上?
似乎没有很好地定义 Java IDE 和编译/部署过程如何与 Vagrant VM 协同工作。一般来说,我的印象是代码在主机上编辑,在虚拟机上运行,这对于非编译语言非常有效。Stackoverflow 上的其他答案 暗示 Vagrant 对于编译语言不太有用,因为需要额外的编译步骤,但我仍然想看看能做些什么。
我已经考虑了一些事情:
为什么在虚拟机上编译
如果在主机上编译,需要安装Java,使其成为另一个软件。如果在主机上编译,则必须手动将主机上的Java版本与VM上的Java版本保持更新。主机上对应的Java版本可能无法使用(如在Mac上)。
为什么在VM上有IDE
环境和IDE之间的紧密集成,可以使用快捷键运行应用程序。可以连接调试器以进行Java应用程序的调试(一步运行/调试)。
为什么在主机上编译
更快的编译时间。希望将VM尽可能接近于生产环境。
为什么在主机上有IDE
编辑代码并在VM上运行是vagrant的惯例。UI性能更好(X forwarding和VNC很慢)。
你怎么看:我应该从VM或主机内运行我的IDE?我应该在VM或主机内编译吗?

(和其他人):你们还在使用Vagrant吗?在今天的机器和工具(+SSD等)中,在虚拟机内运行IDE是否有意义? - Manoj Govindan
2个回答

62
经过反复思考和尝试,我决定在哪里使用Vagrant以及它如何与Java开发流程集成。
对于JavaEE/已部署应用程序来说,配置Web服务器和数据库服务器绝对足够复杂,需要使用Vagrant。有两个服务器和众多的配置方式,很容易导致不同开发者之间的配置不一致,从而带来“在我的机器上可以运行”的情况。对于这种软件,最好在主机上编辑和编译代码,然后部署到模拟生产环境的Vagrant虚拟机中。Web服务器的部署文件夹甚至可以链接到主机上的编译目标,省去了手动重新部署的需要。因此,Vagrant可以是开发生命周期的重要组成部分,但是与PHP/Ruby/Node等代码在主机上运行时的周期相比,从主机编写/编译/部署到虚拟机并在其中运行Java的周期会更长。
对于独立的Java应用程序(如库或桌面应用程序),情况稍有改变。在这种情况下,在主机上编辑、编译和运行是最明智的选择,完全避免使用Vagrant。如果您正在使用Eclipse、Netbeans、IntelliJ等大型Java IDE,则已经在计算机上安装了Java。此时,与使用Vagrant相比,几乎没有优势,只会在开发过程中增加额外的复杂性。这是因为当您能够使用IDE编辑Java时,您已经能够在主机上运行所有内容了。一个问题是项目所需的Java版本可能与主机上运行的IDE的版本不匹配。一般来说(希望如此),这不会成为太大的问题;截至本文撰写时,JDK6已经结束生命周期,JDK8尚未发布(猜猜我们会怎么样)。但是,如果确实需要运行多个版本,则应该根据需要在主机上设置JAVA_HOME。虽然这确实引入了额外的复杂性,但它比维护Vagrant运行时来处理使用不同版本Java的项目的复杂性要少。有趣的问题是如何处理无容器的Web应用程序。 对于这种情况下的内部Web服务器,是否像外部Web服务器那样在VM内运行?还是像独立应用程序那样在主机上运行?对于无容器的Web应用程序,不需要担心外部Web服务器,但可能仍然有一个数据库。 在这种情况下,我们可以采用混合方法。 运行无容器的Web应用程序与运行独立应用程序基本相同,因此在主机上编译和运行代码将非常有效。 但是,由于涉及到数据库,仍然存在足够的复杂性和配置,因此有理由将数据库服务器放在其自己的Vagrant VM上。
希望这为有兴趣使用Vagrant的Java开发人员提供了一些上下文信息。

对于一个 Windows 操作系统主机和 Linux 操作系统虚拟机,您认为在 Linux 虚拟机上运行 IntelliJ,通过 X11 在主机(Windows)上运行的想法如何? - Kevin Meredith
5
好问题:我没有提到,但我确实在Vagrant虚拟机内部进行了大量测试,发现性能非常差... 比如,点击菜单需要大约12秒才能响应。我尝试了一些方法,比如指定更快的加密算法,为X11使用压缩,并增加虚拟机视频RAM,但响应时间仍然是4秒,仍然无法使用。因此,我的想法是Vagrant不适用于运行IDE。 - Jason
1
我认为你应该试一试 - 我没有启用VirtualBox 2D加速,因为那是针对Windows主机的(而我没有Windows主机)。其他性能优化想法包括:VMWare的提供者据说具有特殊的图形优化,可以尝试VRDP,它可能比X11性能更好,NX服务器据说比X11更快,最后还有spice-space.org。如果你发现任何有效的方法,请在这里回帖,因为我很想听听! - Jason
3
我没有在虚拟机中测试过IntelliJ(也许不会,因为一位同事曾经在虚拟机中遇到它的速度缓慢问题)。然而,在《Vagrant - Up and Running》一书中,我读到了以下内容:“当虚拟机中有大量I/O时,共享文件夹会给性能带来很大的惩罚,因此它们只应该用于源文件。任何编译步骤、数据库文件等都应该在客户机文件系统内的共享文件夹文件系统之外完成。”这本书(由Vagrant创始人撰写)的陈述似乎反对在主机VM中进行编译,是吗? - Kevin Meredith
4
这句话提到“虚拟机内的重大性能惩罚”,并没有提到主机的全局性能惩罚,因此我认为这里的上下文是关于VM内部的性能/操作。在这种情况下,我理解这句话是预测在客户机内进行编译步骤时的性能,而不是建议将编译放在客户机上还是主机上。您能否更多地讲述此引用的背景?这本书是否特别涉及此场景?当然,所有这些都需要进行实际测试 :) - Jason

4

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

我的解决方案是使用可配置标志的vagrant虚拟机。 例如,其中一个标志可以启用桌面GUI,因为有些开发人员更喜欢在主机上编写代码,而其他人则更喜欢将桌面和其中的IDE集成得更好。

为了解决桌面速度缓慢的问题,您应该安装一个非常有用的vagrant插件(是的... vagrant有插件,可以极大地改善开发环境),方法如下:vagrant plugin install vagrant-vbguest 此插件将在每个客户端上安装虚拟盒子客户端附加组件,以便在使用虚拟盒子界面时可以使用它。 然后,按照以下方式编辑Vagrantfile以启用GUI:

config.vm.provider "virtualbox" do |vb| vb.gui = true end

为了加快共享文件夹的性能,我建议使用rsync: config.vm.synced_folder "./git", "/home/vagrant/git", type: "rsync", rsync__exclude: ".git/" 这样,源代码在主机上进行编辑,然后再通过rsync同步到客户端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接