【问题标题】:Vagrant for a Java project: should you compile in the VM or on the host?Java 项目的 Vagrant:你应该在 VM 上编译还是在主机上编译?
【发布时间】:2013-07-11 14:47:35
【问题描述】:

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

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

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

为什么要在虚拟机上编译

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

为什么虚拟机上有 IDE

  • 环境与IDE集成更紧密,可以使用快捷方式运行应用程序
  • 可以为java应用程序连接调试器,无需远程调试(一步运行/调试)

为什么要在主机上编译

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

为什么主机上有 IDE

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

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

【问题讨论】:

  • (和其他人):你还在使用 Vagrant 吗?对于当今的机器和工具(+SSD 等),在 VM 中运行 IDE 是否有意义?

标签: java vagrant


【解决方案1】:

经过深思熟虑和试验,我决定在哪里使用 Vagrant 以及它如何与 Java 开发工作流集成。

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

对于独立的 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 开发人员了解如何使用它。

【讨论】:

  • 对于 Windows 操作系统主机和 Linux 操作系统虚拟机,您对在 Linux 虚拟机上运行 IntelliJ,通过 X11 在主机(Windows)上运行有何想法?
  • 好问题:我没有提到它,但我确实在 Vagrant VM 中运行 IDE 进行了很多测试,发现性能可怕.. . 就像点击一个菜单需要大约 12 秒来响应。我尝试了类似的方法:指定更快的密码,对 X11 使用压缩,并增加 VM 视频 RAM,但响应时间为 4 秒,但仍然无法使用。所以我的想法是 Vagrant 不适合运行 IDE。
  • 我认为你应该试一试 - 我没有启用 VirtualBox 2D 加速,因为它适用于 Windows 主机(而且我没有 Windows 主机)。我没有尝试的其他性能想法包括:传闻 VMWare 的提供商有特殊的图形优化,可以尝试可能比 X11 性能更好的 VRDP,NX 服务器应该比 X11 更快,最后还有香料-空间.org。如果您发现任何效果良好的东西,请在此处发帖,因为我很想听听!
  • 我没有在来宾 VM 中测试 IntelliJ(并且可能没有给同事在来宾中运行缓慢的经验)。但是,我在“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. 这本书的声明(由 Vagrant 创建者撰写)似乎反对在主机 VM 中进行编译,不是吗?
  • 引用提到“虚拟机内的严重性能损失”,并没有提到主机的全局性能损失,所以我认为这里的上下文是针对性能/操作内部虚拟机。在这种情况下,我将这句话解释为在客户机内部完成编译步骤时预测性能,而不是推荐在客户机和主机上进行编译。你能多谈谈这句话的背景吗?这本书是否专门针对这种情况?当然这一切都要经过实际测试:)
【解决方案2】:

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

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

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

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

为了加快共享文件夹的性能,我建议使用 rsync: config.vm.synced_folder "./git", "/home/vagrant/git", 类型: "rsync", rsync__exclude: ".git/" 通过这种方式,源代码在主机上进行编辑,然后 rsync-ed 到客户机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多