2015-05-09 16 views
5

Chúng tôi có dự án Maven Java Spring Spring Hibernate lớn đang ngày càng lớn hơn.Dự án Java trở nên quá lớn

vấn đề:

  • thời gian xây dựng là 10-12 phút ở tốt nhất; 3 phút mà không cần thử nghiệm
  • Chúng tôi đã có công tắc dòng lệnh để bỏ qua các mô-đun hiếm khi được sửa đổi, đó là triệu chứng của quá trình xây dựng đạt đến giới hạn thực tế
  • Eclipse đang gặp khó khăn trong việc quản lý dự án (mặc dù IntelliJ vẫn ổn)
  • Mọi thứ trở nên tồi tệ hơn khi dự án phát triển và càng nhiều kịch bản từ nhóm thử nghiệm được kết hợp làm kiểm tra tích hợp trong cơ sở mã.

Làm thế nào chúng tôi làm việc tại

  • Dự án được cấu hình trong khoảng 20 module Maven, như vậy:
 
    Parent 
    |--- Tier1 
    |--- Tier2 
    |--- WebTier 
     |---- ModuleA 
     |---- ModuleB 
     |---- ModuleC 
     |---- ... 
     |---- Entities 
     |---- Shared 
     |---- Batch 
     |---- IntegrationTests 
  • Ứng dụng này được xây dựng như một WAR đơn
  • Nhà phát triển triển khai một cấp duy nhất (typicall y WebTier) như một đồ tạo tác từ Eclipse hoặc IntelliJ đến địa chỉ Tomcat
  • Mặc dù dự án dường như được phân tách độc đáo trong các mô-đun, có nhiều điểm ghép nối không mong muốn giữa chúng. Đặc biệt trong Shared, nơi các module cần "cross-module" truy cập đặt dịch vụ của họ
  • Tất cả các xét nghiệm hội nhập đang ở trong một mô-đun chuyên dụng (không biết tại sao)

Ý tưởng để làm cho nó tốt hơn

  • Thêm mô-đun MessageBroker để cho phép khớp nối lỏng lẻo khi có liên quan. Có lẽ JMS, hoặc đơn giản là một câm trong bộ nhớ thành phần cho thông tin liên lạc đồng bộ
  • Loại bỏ các module Shared
  • Hãy chắc chắn rằng các module có hạt thô nhập cảnh điểm
  • Tháo khớp nối không mong muốn giữa anh chị em ruột và thích người môi giới thông báo khi có thể
  • Có thể giữ Entities. Ít nhất là các thực thể kinh doanh cốt lõi (Customer, CustomerFile, ...). Nhưng một số thực thể rõ ràng là thuộc về một mô-đun duy nhất (một thông tin thực hiện hàng loạt sẽ là trong module Batch)

Bằng cách đó, bất cứ ai làm cho một sự thay đổi để ModuleA sẽ hầu hết thời gian duy nhất xây dựng và chạy thử nghiệm trong mô-đun mà không sợ phá vỡ ứng dụng.

Câu hỏi

  • Liệu rằng có vẻ như một kế hoạch tốt?Bởi tốt, tôi có nghĩa là trong tương lai, với cơ hội tốt để cải thiện mọi thứ, và không đòi hỏi quá nhiều công việc cho tình huống
  • Nếu chúng ta có 1 dự án Eclipse/IJ trên mỗi tầng, hãy để IDE xây dựng đồ tạo tác và triển khai nó cho Tomcat, hay chúng ta nên có 1 dự án cho mỗi mô-đun và phụ thuộc vào Nexus? Hoặc có thể tùy chọn thứ hai là quá mức cần thiết?
  • Bất kỳ đề xuất nào khác?

Một số số liệu

  • Windows 7, Java 8, Maven 3.0.3, TestNG.
  • SSD hoặc HDD 7200rpm (tác động hạn chế)
  • 6Gb RAM
  • Heap 1Gb (maven)
  • CI với Jenkins

Cảm ơn một bó!

+0

Có vẻ như bạn có thể cần RAM lớn hơn hoặc nhiều RAM hơn (hoặc cả hai). –

+0

Bạn có thể cung cấp thêm một chút thông tin về quy mô của dự án không? Thực sự chỉ có 20 module maven và mất 10-13 phút xây dựng thời gian (âm thanh cực kỳ chậm). Có bao nhiêu bài kiểm tra đang chạy? Các xét nghiệm mất bao lâu? Bạn đang sử dụng phiên bản Maven nào? Có bao nhiêu dòng mã (đo bằng SonarQube?) Bạn đang chạy một giải pháp CI như jenkins? Bạn đang nói về loại công tắc dòng lệnh nào? Bạn có máy xây dựng chuyên dụng không? Làm thế nào nhiều RAM/CPU vv và loại đĩa cứng nào máy này có? Bao nhiêu RAM/CPU làm stationgs làm việc có? Hệ điều hành nào? – khmarbaise

+0

@khmarbaise Công tắc dòng lệnh chỉ là một '-DskipSomeModules' khớp với một cấu hình maven để bỏ qua một số mô-đun hiếm khi được sử dụng. Không có gì đặc biệt ở đây, chỉ là một điều kỳ quặc cho thấy chúng tôi không làm đúng IMO. Chúng tôi có CI với Jenkins nhưng có vẻ như không liên quan ở đây: đó là xây dựng dev địa phương mà đau, và nó chỉ có thể được thực hiện bằng cách xây dựng WAR đầy đủ vì khớp nối thường xuyên. Sẽ lấy lại cho bạn thông tin được yêu cầu vào ngày mai. Cảm ơn bạn. – youri

Trả lời

1

CI sẽ là câu trả lời thực sự nhưng có vẻ như dự án của bạn không phải là mô-đun. Bạn không xây dựng toàn bộ dự án từ đầu mỗi lần. Bạn xây dựng lọ, kiểm tra chúng trong các dự án khác nhau và sau đó sử dụng như là các mục duy nhất. Mỗi dự án phải đủ nhỏ và chỉ bao gồm một khu vực. Bạn có nghĩ rằng Java xây dựng chúng ta hãy nói rằng các lọ bảo mật khi chúng hoạt động trên gói io? Chia và chinh phục - đó là toàn bộ ý tưởng về OOP và đóng gói.

+0

Không phải là mô-đun như nó có vẻ chắc chắn, do đó tôi câu hỏi về cách tôi có thể làm cho nó tốt hơn. Tôi phải thuyết phục các đồng đội của tôi rằng tình hình hiện tại là đau đớn và sẽ làm tổn thương đội bóng trong thời gian dài, và rằng chúng ta có thể dựa vào một kế hoạch và tin tưởng nỗ lực tái cấu trúc sẽ đáng giá. – youri

+0

Đây là câu hỏi kiến ​​trúc nhiều hơn mà không thể trả lời được nếu không có phân tích đầy đủ. Ít nhất vẽ sơ đồ lớp và xem kết nối là gì. – Alex

0

Điều này có thể không tệ như bạn nghĩ. Các dự án tham gia với các bài kiểm tra đơn vị và phân tích tĩnh mất một thời gian.

Một công ty mà tôi đã làm việc có> 1 giờ xây dựng + unitTest + CodeCung cấp thời gian tích hợp. Điều đó không tính thời gian cần thiết để gửi đồ tạo tác đến vSphere để thử nghiệm nhấp qua tự động của trình cài đặt trên 26 ngôn ngữ x 8 hệ điều hành được hỗ trợ.

+0

Tôi không quan tâm đến 10 'cho một bản dựng hoàn chỉnh. Vấn đề là chúng ta phải làm điều đó mỗi khi chúng ta thực hiện một thay đổi duy nhất. Nếu tôi sửa đổi những thứ trong ModuleX chỉ, hy vọng, tôi không cần phải lo lắng về ModuleA hoặc ModuleB.Chúng tôi không bao giờ tự tin rằng chúng tôi sẽ không phá vỡ bất cứ điều gì không liên quan. Nó thực sự ngược lại. Vào cuối ngày, thêm 10 phút nữa. Tuy nhiên, các mô-đun thông thường luôn gọi cho một bản dựng đầy đủ rõ ràng. – youri

+0

Cân nhắc thiết lập các công việc xây dựng tham số trong Jenkins để bạn có thể nói kịch bản xây dựng để xây dựng "mô-đun A" theo yêu cầu, và sau đó cron xây dựng hàng giờ để xây dựng hệ thống đầy đủ. Điều này sẽ giải quyết vấn đề của một dev muốn ModuleA để được xây dựng và thử nghiệm ngay lập tức, cũng như sự cần thiết để hỗ trợ xây dựng tích hợp đầy đủ cho hồi quy và kiểm tra đơn vị hoàn chỉnh. Bạn cũng có thể có một mục tiêu ant/msbuild riêng biệt (hoặc bất kỳ thứ gì bạn đang sử dụng) trong cùng một công việc Jenkins sẽ xây dựng và kiểm thử đơn vị chỉ mô-đun theo yêu cầu mà chuyển tham số Công việc Jenkins cho tập lệnh xây dựng. – JasonRobinson

Các vấn đề liên quan