Vilerant for Java项目:您应该在VM中还是在主机上编译?

Jay*_*Jay 91 java vagrant

这是一个问题:当将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上运行它的流浪惯例
  • 更好的UI性能(X转发和VNC很慢)

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

Jay*_*Jay 61

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

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

对于独立的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开发人员一些关于如何使用它的上下文.

  • 该引用提到"虚拟机内的性能损失很大",并未提及主机的全局性能损失,因此我认为此处的上下文是针对VM*内的性能/操作*.在这种情况下,我将此引用解释为在完成编译步骤在guest虚拟机内部完成时预测性能,而不是建议在guest虚拟机上对主机进行编译.你能说一下这句话的背景吗?这本书是专门针对这种情况的吗?当然这一切都要经过实际测试:) (4认同)
  • 很棒的问题:我没有提到它,但我确实在Vagrant VM中运行IDE进行了大量测试,发现性能非常糟糕*...因为点击菜单大约需要12秒才能响应.我试过这样的事情:指定一个更快的密码,对X11使用压缩,并增加VM视频RAM,只是为了让响应时间达到4秒仍然无法使用.所以我的想法是Vagrant不适合运行IDE. (3认同)
  • 我没有在访客VM中测试IntelliJ(并且可能没有给出同事在访客VM中的缓慢经历).但是,我在"Vagrant - Up and Running"中阅读了以下内容:`当I/O繁重时,共享文件夹会在虚拟机中造成严重的性能损失,因此它们只应用于源文件.任何编译步骤,数据库文件等都应该在来宾文件系统内部的共享文件夹文件系统之外完成.本书的陈述(由Vagrant创建者编写)似乎反对主机VM中的编译,不是吗? (2认同)