2011-01-10 19 views
8

Tại sao bạn nên đưa các tệp Java jar vào một kho lưu trữ (CVS, SVN ..)Các tệp jar Java vào một kho lưu trữ (CVS, SVN ..)

+0

Bạn có thể làm rõ nếu bạn đang nói về các lọ hoặc lọ của bên thứ ba được tạo ra từ mã nguồn của riêng bạn? –

+0

Cả hai. tệp jar được tạo từ các nguồn do chúng tôi sở hữu và tệp jar của bên thứ ba/nguồn mở. – Neel

+1

Điều này có thể được tranh luận mãi mãi, sở thích của tôi là bao gồm các lọ và KHÔNG sử dụng một công cụ phụ thuộc vì chúng chỉ giới thiệu một lớp phức tạp khác cho một vấn đề cực kỳ đơn giản để quản lý. – Randyaa

Trả lời

8

Vì bạn có thể xây dựng lại chúng từ nguồn. Mặt khác, nếu bạn đang nói về các tệp JAR của bên thứ ba được yêu cầu bởi dự án của bạn thì tốt hơn bạn nên cam kết chúng vào kho lưu trữ để dự án là khép kín.

+7

Vâng, đối với các phụ thuộc, giải pháp không nằm trong SCM, mà là sử dụng công cụ quản lý phụ thuộc (như Ivy hoặc Maven), để có định nghĩa của chúng trong SCM, nhưng các JAR hiệu quả ở nơi khác. – Riduidel

+0

@Riduidel - đây phải là câu trả lời – Anon

+0

@Riduidel - Bạn có thể mô tả lý do tại sao bạn cho rằng nên lưu trữ lọ ở nơi khác không? Người đăng có lẽ đã nhìn thấy những bình luận giống như của bạn trước đó khiến anh ta hỏi câu hỏi của anh ấy và câu hỏi của họ cũng khiến tôi khó hiểu. –

3

Họ là những tập tin nhị phân:

  • Nó tốt hơn để tham khảo các nguồn, vì đó là những gì bạn đang sử dụng kiểm soát nguồn cho.
  • Hệ thống không thể cho bạn biết sự khác biệt nào giữa các tệp
  • Chúng trở thành nguồn xung đột hợp nhất, trong trường hợp chúng được biên dịch từ nguồn trong cùng một kho lưu trữ.
  • Một số hệ thống (ví dụ: SVN) không xử lý khá tốt với các tệp nhị phân lớn.

Nói cách khác, hãy tham chiếu tốt hơn nguồn và điều chỉnh tập lệnh xây dựng để mọi thứ hoạt động.

+0

Bạn có chắc SVN không xử lý tốt các tệp nhị phân không? Từ các tài liệu SVN nó xử lý các tệp nhị phân và văn bản giống hệt nhau. http://svnbook.red-bean.com/en/1.5/svn.forcvs.binary-and-trans.html Ngoài ra, hãy xem trang wiki cộng đồng này: http: // stackoverflow.com/questions/538643/how-good-is-subversion-at-storage-lots-of-binary-files –

+0

@Kevin: cảm ơn, tôi đã cập nhật câu trả lời của tôi – vdboor

2

Quyết định đưa tệp jar vào SCM thường bị ảnh hưởng bởi công cụ xây dựng đang được sử dụng. Nếu sử dụng Maven theo cách thông thường thì bạn không thực sự có lựa chọn. Nhưng nếu hệ thống xây dựng của bạn cho phép bạn lựa chọn, tôi nghĩ đó là một ý tưởng tốt để cam kết các phụ thuộc của bạn với SCM cùng với mã nguồn phụ thuộc vào chúng.

Điều này áp dụng cho các lọ bên thứ ba và các bình trong nhà trên chu kỳ phát hành riêng cho dự án của bạn. Ví dụ, nếu bạn có một tệp jar trong nhà chứa các lớp tiện ích phổ biến, tôi sẽ cam kết với SCM theo từng dự án sử dụng nó.

Nếu sử dụng CVS, lưu ý rằng nó không xử lý tệp nhị phân hiệu quả. Kho lưu trữ SVN không phân biệt giữa tệp nhị phân và tệp văn bản.

http://svnbook.red-bean.com/en/1.5/svn.forcvs.binary-and-trans.html

Cập nhật để đáp ứng với câu trả lời đăng bởi Mark:

WRT đạn điểm 1: Tôi có thể nói nó không phải là rất phổ biến cho ngay cả một dự án lớn có hàng trăm phụ thuộc. Trong mọi trường hợp, việc sử dụng đĩa (bằng cách giữ một bản sao riêng biệt của một phụ thuộc trong mỗi dự án sử dụng nó) không nên là mối quan tâm chính của bạn. Dung lượng ổ đĩa là rẻ so với lượng thời gian bị mất đối phó với sự phức tạp của kho lưu trữ Maven. Trong mọi trường hợp, một kho lưu trữ Maven cục bộ sẽ tiêu tốn không gian đĩa nhiều hơn chỉ là các phụ thuộc mà bạn thực sự sử dụng.

Đạn 3: Maven sẽ không giúp bạn tiết kiệm thời gian chờ lưu lượng truy cập mạng. Mặt trái là sự thật. Với sự phụ thuộc của bạn trong kiểm soát nguồn, bạn thực hiện thanh toán, sau đó bạn chuyển từ nhánh này sang nhánh khác. Bạn sẽ rất hiếm khi cần phải kiểm tra các lọ giống nhau một lần nữa. Nếu bạn làm thế, nó sẽ chỉ mất vài phút. Lý do chính Maven là một công cụ xây dựng chậm là tất cả các truy cập mạng nó thậm chí khi không có nhu cầu.

Dấu đầu dòng 4: Điểm của bạn ở đây không phải là đối số chống lại lưu trữ trong SCM và Maven chỉ dễ dàng khi bạn đã học nó và nó chỉ hiệu quả đến mức khi có sự cố. Sau đó, nó trở nên khó khăn và tăng hiệu quả của bạn có thể biến mất một cách nhanh chóng. Xét về hiệu quả, Maven có một điểm yếu nhỏ khi mọi thứ hoạt động chính xác và một nhược điểm lớn khi chúng không hoạt động.

Dấu đầu dòng 5: Hệ thống kiểm soát phiên bản như SVN không giữ bản sao riêng biệt của mọi phiên bản của mỗi tệp. Nó lưu trữ chúng hiệu quả như vùng đồng bằng. Rất hiếm khi kho SVN của bạn sẽ phát triển thành kích thước 'không thể quản lý'.

Dấu đầu dòng 6: Điểm của bạn ở đây không phải là đối số để lưu trữ tệp là SCM. Trường hợp sử dụng mà bạn đề cập có thể được xử lý dễ dàng bởi một bản dựng Ant tùy chỉnh.

4

Hệ thống kiểm soát nguồn được thiết kế để giữ mã nguồn văn bản. Họ có thể giữ các tệp nhị phân, nhưng đó không thực sự là những gì chúng được thiết kế. Trong một số trường hợp, bạn nên đặt một tệp nhị phân trong điều khiển nguồn, nhưng các phụ thuộc java thường được quản lý tốt hơn theo một cách khác.

Thiết lập lý tưởng là thiết lập cho phép bạn quản lý các phụ thuộc của mình ngoài tầm kiểm soát nguồn. Bạn sẽ có thể quản lý các phụ thuộc của bạn bên ngoài nguồn và chỉ đơn giản là "trỏ" đến sự phụ thuộc mong muốn từ bên trong nguồn. Điều này có một số lợi thế:

  • Bạn có thể có một số dự án phụ thuộc vào cùng một tệp nhị phân mà không giữ bản sao riêng biệt của từng nhị phân. Nó là phổ biến cho một dự án cỡ trung bình để có hàng trăm tập tin nhị phân nó phụ thuộc vào. Điều này có thể dẫn đến rất nhiều sự trùng lặp làm lãng phí tài nguyên cục bộ và dự phòng.
  • Phiên bản nhị phân có thể được quản lý tập trung trong môi trường địa phương của bạn hoặc trong thực thể công ty.
  • Trong nhiều trường hợp, máy chủ kiểm soát nguồn không phải là tài nguyên cục bộ. Việc thêm một loạt các tệp nhị phân sẽ làm chậm mọi thứ vì nó làm tăng lượng dữ liệu cần được gửi qua kết nối chậm hơn.
  • Nếu bạn đang tạo chiến tranh, có thể có một số lọ bạn cần để phát triển, nhưng không cần triển khai và ngược lại. Một công cụ quản lý phụ thuộc tốt cho phép bạn xử lý các loại vấn đề này một cách dễ dàng và hiệu quả.
  • Nếu bạn phụ thuộc vào tệp nhị phân đến từ một dự án khác của bạn, nó có thể thay đổi thường xuyên. Điều này có nghĩa là bạn có thể liên tục ghi đè mã nhị phân bằng một phiên bản mới. Vì điều khiển phiên bản sẽ giữ mọi bản sao, nó có thể nhanh chóng phát triển thành kích thước không thể quản lý - đặc biệt nếu bạn có bất kỳ kiểu tích hợp liên tục hoặc tập lệnh tạo tự động nào tạo các tệp nhị phân này.
  • Hệ thống quản lý phụ thuộc cung cấp mức độ linh hoạt nhất định về cách bạn phụ thuộc vào tệp nhị phân. Ví dụ, trên máy cục bộ của bạn, bạn có thể muốn phụ thuộc vào phiên bản mới nhất của sự phụ thuộc khi nó nằm trên hệ thống tệp của bạn. Tuy nhiên, khi bạn triển khai ứng dụng của mình, bạn muốn gói phụ thuộc được đóng gói như một cái bình và được bao gồm trong tệp của bạn.

Tính năng quản lý phụ thuộc của Maven giải quyết những vấn đề này cho bạn và có thể giúp bạn xác định vị trí và truy xuất phụ thuộc nhị phân khi cần. Ivy cũng là một công cụ khác, nhưng đối với Ant.

+0

Xin chào Mark, hai câu đầu tiên của bạn là đúng liên quan đến CVS nhưng không cho SVN (và tôi sẽ đoán SCMs hiện đại nhất). http://svnbook.red-bean.com/en/1.5/svn.forcvs.binary-and-trans.html –

+0

Kevin, tôi nhận ra rằng hầu hết các SCM có thể chứa thông tin nhị phân. Tôi chỉ nói rằng chúng chủ yếu được xây dựng để lưu trữ văn bản. Nhiều công cụ bạn sẽ sử dụng với SCM chỉ có ý nghĩa khi xử lý các tệp văn bản. Ngoài ra nếu bạn đang lưu trữ các tệp .jar lớn trong SCM của bạn và chúng thay đổi (trong tên tệp và nội dung) khi bạn nâng cấp lên các phiên bản khác nhau, kho lưu trữ của bạn có thể trở nên khá cồng kềnh với tất cả các phiên bản khác nhau của tệp nhị phân. Trong một số trường hợp, điều này có thể không quan trọng, nhưng ở một số trường hợp khác, nó có thể làm chậm hoạt động của bạn và sao lưu nhiều hơn một vấn đề. – Mark

+0

Hi Mark, ngoại trừ CVS cổ, không đúng là SCM được xây dựng để lưu trữ văn bản. Theo như lưu trữ là có liên quan, tất cả các tập tin nhị phân và họ sử dụng một thuật toán nhị phân hiệu quả nhị phân. –

7

Vì vậy, bạn có một dự án sử dụng một số phụ thuộc bên ngoài. Phụ thuộc này cũng được biết đến. Tất cả đều có

  • Một nhóm (thông thường, tổ chức/Forge tạo ra chúng)
  • Một định danh (tên họ)
  • Một phiên bản

Trong thuật ngữ maven, những thông tin được gọi là artifact (Jar của bạn) tọa độ.

Các phụ thuộc tôi đang nói đến là nội bộ (đối với ứng dụng web, có thể là lớp dịch vụ/miền của bạn) hoặc bên ngoài (log4j, trình điều khiển jdbc, khung Java EE, bạn đặt tên, ...). Tất cả những phụ thuộc đó (cũng được gọi là hiện vật) là thực tế, ở mức thấp nhất của chúng, các tệp nhị phân (JAR/WAR/EAR) mà CVS/SVN/GIT của bạn sẽ không thể lưu trữ hiệu quả. Thật vậy, SCM sử dụng giả thuyết rằng nội dung được phiên bản, một trong những hoạt động khác biệt hiệu quả nhất) chỉ là văn bản. Kết quả là, khi dữ liệu nhị phân được lưu trữ, chúng hiếm khi tối ưu hóa lưu trữ (trái với văn bản, nơi chỉ có các phiên bản khác nhau được lưu trữ).

Kết quả là, điều tôi muốn đề xuất và bạn là sử dụng hệ thống xây dựng quản lý phụ thuộc, như maven, Ivy hoặc Gradle. bằng cách sử dụng công cụ như vậy, bạn sẽ khai báo tất cả các phụ thuộc của bạn (trên thực tế, trong tệp này, bạn sẽ khai báo các tọa độ tạo phẩm phụ thuộc) trong một tệp văn bản (hoặc có thể là XML), sẽ nằm trong SCM của bạn. NHƯNG phụ thuộc của bạn sẽ không có trong SCM. Thay vào đó, mỗi developper sẽ tải chúng về máy dev của nó.

Điều này chuyển tải một số mạng từ máy chủ SCM sang internet (băng thông thường bị giới hạn nhiều hơn mạng nội bộ) và hỏi câu hỏi về sự tồn tại lâu dài của các hiện vật. Cả hai câu trả lời này đều được giải quyết (ít nhất là trong công việc, nhưng tôi tin rằng cả Ivy và gradle đều có thể kết nối với những công cụ như vậy - và có vẻ như một số câu hỏi đã được hỏi về chủ đề này) bằng cách sử dụng các proxy doanh nghiệp, như Nexus, Artifactory và khác. Vẻ đẹp của những công cụ này là chúng có sẵn trong mạng nội bộ một cái nhìn của tất cả các tạo phẩm cần thiết, cho phép bạn triển khai các tạo tác của riêng bạn trong các kho này, giúp việc chia sẻ mã của bạn trở nên dễ dàng và độc lập với nguồn (có thể là một lợi thế).

Để tổng hợp câu trả lời dài này: hãy sử dụng Ivy/Maven/Gradle thay vì xây dựng Ant đơn giản. Những công cụ này sẽ cho phép bạn xác định các phụ thuộc của bạn và thực hiện tất cả công việc tải xuống các phụ thuộc này và đảm bảo bạn sử dụng phiên bản được khai báo. Trên một lưu ý cá nhân, ngày tôi phát hiện ra những công cụ này, tầm nhìn của tôi về xử lý phụ thuộc trong Java nhận được từ cơn ác mộng đến thiên đường, vì bây giờ tôi chỉ phải nói rằng tôi sử dụng phiên bản này của công cụ này và maven (trong trường hợp của tôi), làm tất cả các công việc nền của tải nó và lưu trữ ở đúng vị trí trên máy tính của tôi.

+0

CVS không lưu trữ các tệp nhị phân hiệu quả. Tuy nhiên, SVN (và tôi đoán Git, Mercury, vv) lưu trữ tất cả mọi thứ trong một định dạng nhị phân hiệu quả, ngay cả các tập tin văn bản. –

+0

Theo mặc định, Mercurial không lưu trữ các tệp nhị phân một cách hiệu quả. Nó lưu trữ các byte và nếu một byte thay đổi trong tập tin, toàn bộ một bản sao của tập tin đó được lưu trữ một lần nữa. Xem phần mở rộng "largefiles" để làm việc với các tệp nhị phân (nhưng nó đi kèm với sự cân bằng) –

+0

Ngoài ra, maven cho phép bạn liên kết các dự án trong Eclipse/intellij khi bạn đang làm việc trên một thư viện mà không cần mucking với classpath để trỏ đến một dự án thay thế của thư viện. Và tất nhiên, nó quản lý tất cả các depedencies transitive và chăm sóc các tệp .jar chồng chéo (sau khi tất cả, nó là một "người quản lý phụ thuộc") Versioning đơn giản hơn, tổng thể, kiểm tra .jars vào kiểm soát nguồn chỉ là đau đớn. – cgp

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