Vagrant cho một dự án Java: bạn nên biên dịch trong VM hay trên máy chủ lưu trữ?


92

Đây là câu hỏi: Khi sử dụng Vagrant cho một dự án Java (hoặc bất kỳ dự án ngôn ngữ biên dịch nào cho vấn đề đó), bạn nên biên dịch trong VM hay trên máy chủ lưu trữ? Ngoài ra, bạn muốn IDE của mình và tất cả các công cụ phát triển của bạn cũng được chạy từ bên trong máy ảo hay trên máy chủ lưu trữ?

Có vẻ như chưa được xác định rõ ràng về cách thức hoạt động của Java IDE và quá trình biên dịch / triển khai với máy ảo Vagrant. Nói chung, ấn tượng của tôi là mã được chỉnh sửa trên máy chủ và chạy trên máy ảo, hoạt động tốt cho các ngôn ngữ không được biên dịch. Các câu trả lời khác trên Stackoverflow đã ngụ ý rằng Vagrant ít hữu ích hơn cho các ngôn ngữ đã biên dịch vì phải thực hiện thêm bước biên dịch, nhưng tôi vẫn muốn xem những gì có thể được thực hiện.

Một số điều tôi đã nghĩ qua:

Tại sao phải biên dịch trên VM

  • nếu biên dịch trên máy chủ, java là một phần mềm nữa để cài đặt
  • nếu biên dịch trên máy chủ, phiên bản java trên máy chủ phải được cập nhật theo cách thủ công trên máy ảo
  • phiên bản java tương ứng trên máy chủ có thể không khả dụng (giả sử trên máy Mac)

Tại sao có IDE trên VM

  • tích hợp chặt chẽ hơn giữa môi trường và IDE, có thể sử dụng phím tắt để chạy ứng dụng
  • có thể kết nối trình gỡ lỗi cho các ứng dụng java mà không cần gỡ lỗi từ xa (chạy / gỡ lỗi một bước)

Tại sao phải biên dịch trên máy chủ

  • thời gian biên dịch nhanh hơn
  • muốn giữ cho VM càng gần với giao diện sản xuất càng tốt

Tại sao có IDE trên máy chủ

  • quy ước của người lang thang để chỉnh sửa mã trên máy chủ và chạy nó trên máy ảo
  • hiệu suất giao diện người dùng tốt hơn (chuyển tiếp X và VNC chậm)

Suy nghĩ của bạn là gì: tôi nên chạy IDE của mình từ bên trong máy ảo hay máy chủ lưu trữ? Tôi nên biên dịch từ bên trong máy ảo hay máy chủ lưu trữ?

Câu trả lời:


61

Sau nhiều suy nghĩ và thử nghiệm, tôi đã quyết định sử dụng Vagrant ở đâu và cách nó tích hợp với quy trình phát triển Java.

Đối với JavaEE / các ứng dụng đã triển khai, việc định cấu hình máy chủ web và máy chủ cơ sở dữ liệu chắc chắn là những thứ có độ phức tạp "đủ" để đảm bảo việc sử dụng Vagrant. Với hai máy chủ và vô số cách để cấu hình chúng, rất dễ khiến cấu hình không đồng bộ từ nhà phát triển này sang nhà phát triển khác, dẫn đến hội chứng "hoạt động trên máy của tôi". Đối với loại phần mềm này, cách tốt nhất là chỉnh sửa và biên dịch mã trên máy chủ lưu trữ và triển khai tới một máy ảo Vagrant bắt chước môi trường sản xuất của bạn. Thư mục triển khai cho máy chủ web thậm chí có thể được liên kết với một mục tiêu biên dịch trên máy chủ, loại bỏ nhu cầu triển khai lại theo cách thủ công. Vì vậy, Vagrant có thể là một phần quan trọng trong vòng đời phát triển của bạn,

Đối với các ứng dụng Java độc lập (như thư viện hoặc ứng dụng máy tính để bàn), câu chuyện có một chút thay đổi. Trong trường hợp này, việc chỉnh sửa, biên dịch và chạy trên máy chủ là hợp lý nhất, tránh hoàn toàn việc sử dụng Vagrant. Nếu bạn đang sử dụng một trong các IDE Java lớn (Eclipse, Netbeans, IntelliJ ...), bạn đã cài đặt Java trên máy. Ở điểm đó, có rất ít lợi thế so với chi phí sử dụng Vagrant và chỉ đóng vai trò tạo thêm một lớp phức tạp trong quá trình phát triển của bạn. Điều này là do vào thời điểm bạn có thể chỉnh sửa Java bằng IDE, bạn vẫn có thể chạy mọi thứ trên máy chủ lưu trữ. Một vấn đề là phiên bản Java được yêu cầu cho dự án có thể không khớp với phiên bản chạy IDE trên máy chủ. Nói chung (hy vọng) đây không phải là vấn đề quá lớn; kể từ khi viết bài này, JDK6 đã hết tuổi thọ và JDK8 vẫn chưa được phát hành (đoán xem điều đó sẽ rời khỏi chúng ta). Nhưng nếu bạn cần chạy nhiều phiên bản, bạn có thể đặt JAVA_HOME trên máy chủ lưu trữ nếu cần. Mặc dù điều này làm tăng thêm độ phức tạp, nhưng nó ít phức tạp hơn so với việc duy trì thời gian chạy Vagrant chỉ để làm việc với các dự án sử dụng các phiên bản Java khác nhau.

Câu hỏi thú vị là phải làm gì với các ứng dụng web không chứa vùng chứa. Máy chủ web (trong trường hợp này là nội bộ của ứng dụng) có nên được chạy bên trong máy ảo như chúng ta đã làm đối với máy chủ web bên ngoài không? Hay chạy trên máy chủ lưu trữ như chúng tôi đã làm đối với ứng dụng độc lập? Đối với các ứng dụng web không chứa vùng chứa, không có máy chủ web bên ngoài phải lo lắng, nhưng vẫn có cơ sở dữ liệu. Trong tình huống này, chúng ta có thể thực hiện một cách tiếp cận kết hợp. Chạy một ứng dụng web không chứa vùng chứa về cơ bản giống như chạy một ứng dụng độc lập, vì vậy sẽ có hiệu quả khi biên dịch và chạy mã của bạn trên máy chủ. Nhưng với một cơ sở dữ liệu liên quan, vẫn có đủ độ phức tạp và cấu hình ở đó để có thể đặt máy chủ cơ sở dữ liệu trên VM Vagrant của riêng nó.

Hy vọng rằng điều này cung cấp cho các nhà phát triển Java, những người quan tâm đến Vagrant một số ngữ cảnh về cách sử dụng nó.


đối với máy chủ lưu trữ hệ điều hành Windows và máy ảo hệ điều hành Linux, suy nghĩ của bạn khi chạy IntelliJ trên máy ảo Linux, chạy trên máy chủ lưu trữ (Windows) đến X11?
Kevin Meredith

3
Câu hỏi tuyệt vời: Tôi không đề cập đến nó nhưng tôi đã thực hiện rất nhiều thử nghiệm với việc chạy IDE bên trong Vagrant VM và nhận thấy rằng hiệu suất rất khủng khiếp ... như khi nhấp vào menu mất khoảng 12 giây để phản hồi. Tôi đã thử những thứ như: chỉ định mật mã nhanh hơn, sử dụng tính năng nén cho X11 và tăng RAM video VM, chỉ để thời gian phản hồi lên 4 giây mà vẫn không sử dụng được. Vì vậy, suy nghĩ của tôi là Vagrant không nhằm mục đích chạy IDE.
Jay

Tuy nhiên, tôi nghĩ bạn nên thử một chút - tôi đã không bật tăng tốc VirtualBox 2D vì tính năng đó dành cho máy chủ Windows (và tôi không có máy chủ Windows). Các ý tưởng hiệu suất khác mà tôi không thể thử bao gồm: nhà cung cấp của VMWare được đồn đại là có tối ưu hóa đồ họa đặc biệt, có thể thử VRDP có thể có hiệu suất tốt hơn X11, Máy chủ NX được cho là nhanh hơn X11 và cuối cùng là gia vị- không gian.org. Nếu bạn thấy bất kỳ điều gì hoạt động tốt, vui lòng đăng lại ở đây vì tôi rất muốn nghe về nó!
Jay

2
Tôi chưa thử nghiệm IntelliJ bên trong máy ảo khách (và có thể không đưa ra kinh nghiệm của đồng nghiệp về sự chậm chạp của nó trong máy khách). Tuy nhiên, tôi đã đọc phần sau trong '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.Tuyên bố của cuốn sách này (được viết bởi người sáng tạo Vagrant) dường như phản đối việc biên dịch trong máy chủ lưu trữ, phải không?
Kevin Meredith

4
Trích dẫn đề cập đến "hình phạt hiệu suất nặng trong máy ảo" và không đề cập đến hình phạt hiệu suất toàn cầu đối với máy chủ, vì vậy tôi nghĩ bối cảnh ở đây là về hiệu suất / hoạt động bên trong máy ảo . Trong bối cảnh đó, tôi giải thích câu trích dẫn này là dự đoán hiệu suất khi một bước biên dịch được thực hiện được thực hiện bên trong khách chứ không phải đề xuất biên dịch trên khách và trên máy chủ. Bạn có thể nói thêm về bối cảnh cho câu trích dẫn này? Cuốn sách có giải quyết tình huống này cụ thể không? Tất nhiên tất cả những điều này là tùy thuộc vào thử nghiệm thực tế :)
Jay

3

Tôi đã quan tâm đến chủ đề này trong năm ngoái :)

Giải pháp của tôi là có một máy mơ hồ có thể định cấu hình với các cờ. Ví dụ: một trong các cờ này cho phép máy tính để bàn vì một số nhà phát triển thích viết mã trên máy chủ trong khi những người khác thích có một môi trường tích hợp hơn nhiều với máy tính để bàn và IDE trong đó.

Để đối mặt với sự chậm chạp của màn hình, bạn nên cài đặt một plugin vagrant rất hữu ích (vâng ... vagrant có các plugin giúp cải thiện đáng kể môi trường phát triển) theo cách này: plugin vagrant cài đặt vagrant-vbguest Plugin này sẽ cài đặt thêm hộp ảo cho mỗi khách để làm cho nó có thể sử dụng được trong khi sử dụng giao diện hộp ảo. Sau đó, để kích hoạt gui, hãy chỉnh sửa Vagrantfile theo cách này:

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

Thay vì tăng tốc hiệu suất thư mục chia sẻ, tôi khuyên bạn nên sử dụng rsync: config.vm.synced_folder "./git", "/ home / vagrant / git", nhập: "rsync", rsync__exclude: ".git /" Trong này cách mã nguồn được chỉnh sửa trên máy chủ và sau đó rsync-ed cho khách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.