2009-02-20 36 views
8

Là nhà phát triển, tôi thường quan tâm đến tính năng ngôn ngữ mới có thể giúp cuộc sống của bạn dễ dàng hơn. Ví dụ, java 5 mang generics và chú thích đến ngôn ngữ, các tính năng chắc chắn có thể tăng năng suất của bạn.Cơ chế phiên bản thực thi nền tảng có phải là tính năng cực kỳ cần thiết của java không?

Tuy nhiên, khi tôi nhìn lại gần một thập kỷ làm việc trên nền tảng java, tôi thấy rằng các vấn đề liên quan đến phiên bản là thủ phạm lớn nhất của nỗ lực không hiệu quả và không cần thiết. Giờ và giờ tìm phiên bản chính xác của jar, cố gắng hòa giải một số xung đột phiên bản, nâng cấp thư viện phụ thuộc, v.v. Khi tôi bắt đầu làm việc với java, mọi thứ không khó, bạn có một vài thư viện của bên thứ 3 và đó là . Hôm nay, ứng dụng web điển hình của bạn có thể dễ dàng sử dụng: Spring Framework, Hibernate, Struts, bạn đặt tên cho nó. Tất cả những điều này mang theo một số thư viện của bên thứ ba phụ thuộc. Hôm nay, lưu trữ tai của tôi thường sẽ bao gồm khoảng 40 thư viện của bên thứ ba trở lên. Một cái địa ngục thật!

Với chú thích, tôi không phải quản lý tệp cấu hình cho Hibernate chẳng hạn. Một tính năng tuyệt vời, nhưng tôi đã không thấy nhiều vấn đề phát sinh từ thực tế tôi giữ các mô tả của mình trong một tệp riêng biệt. Với generics, tôi không được phép viết các phát biểu diễn xuất, nhưng trong toàn bộ nhà phát triển chương trình của mình, tôi không thể nhớ một lỗi có thể đã bị ngăn chặn bằng cách sử dụng vùng chứa an toàn loại. Giải pháp không phiên bản cho vấn đề phiên bản có giá trị hơn nhiều không?

Tất cả những vấn đề này đã dẫn đến số lượng các công cụ như Maven, ivy, One Jar, Jar Jar Links (không đùa!), Thậm chí một cách thích hợp đặt tên Jar Hell vv Thậm chí nếu bạn sử dụng một số các công cụ này, bạn đang ở xa được miễn dịch với các vấn đề. Tôi sử dụng Maven 2 và nó đã là một trợ giúp tuyệt vời. Tuy nhiên, nó là một thế giới cho chính nó. Lập trình viên mới có thể mất một lúc để tìm hiểu nó. Di chuyển các dự án di sản của bạn sang cấu trúc Maven cũng là một nỗi đau.

Dường như trong .Net họ đã học được bài học với địa chỉ dll và quản lý các hội đồng .Net đơn giản hơn rất nhiều.

Có vẻ như có kế hoạch giải quyết vấn đề này cho nền tảng java và các lựa chọn thay thế như OSGI. Tôi nghĩ rằng một số cơ chế phiên bản cơ bản và nền tảng được thi hành là rất cần thiết

+0

Điều này đọc giống như một bình luận hơn là một câu hỏi. – cletus

+0

Tôi đoán đó là một chút của cả hai (một bình luận và rant). Về cơ bản tôi muốn xem liệu những người khác có chung nỗi đau như tôi không. Trong nhiều năm nay, đây là nhu cầu cấp thiết nhất cho nhóm của tôi và tôi cảm thấy thất vọng vì thiếu giải pháp hiệu quả cho vấn đề này. – Dan

+0

Rant hay không, nó vẫn là một câu hỏi hợp pháp. Ít nhất là tiêu đề ngay cả khi câu hỏi không được lặp lại trong phần nội dung của bài đăng. – tvanfosson

Trả lời

4

Xem nhanh OSGi - nó đề cập đến việc phiên bản và quản lý các gói (lọ) rất độc đáo. C2NG: Eclipse (được xây dựng trên OSGi) có một số công cụ API tương đối mới có thể giúp bạn so sánh API của bạn dựa trên đường cơ sở trước đó và xác định cách thể hiện thích hợp số phiên bản tiếp theo của gói của bạn.

Tổng sơ đồ nhật phiên bản:

v.m.n.q 

nơi

v: phiên bản cấp cao - những thay đổi ở đây đại diện cho thường phá vỡ những thay đổi trong API

m: những thay đổi lớn - tính năng mới, API mới

n: thay đổi nhỏ - cùng API, thay đổi hậu trường

q: vòng loại - hữu ích để đánh dấu các bản dựng, alpha/beta, v.v.

OSGi chỉ định phụ thuộc phiên bản sử dụng dải ô.Ví dụ:

Require-Bundle: com.javadude.foo;bundle-version="[1.2.0,2.0.0)" 

trong MANIFEST.MF xác định gói yêu cầu phiên bản 1.2.0 trở lên của bundle com.javadude.foo, qua (nhưng không bao gồm) phiên bản 2.0.0.

Bạn cũng có thể chỉ định phụ thuộc ở cấp gói thay thế.

+0

Tôi biết về OSGI nhưng không xem xét chi tiết hơn. Tôi đã có ấn tượng rằng nó có thể là quá mức cần thiết cho một vấn đề cụ thể mà tôi phải đối mặt. Tôi đoán đó là lúc tôi cho nó một cái nhìn thứ hai. – Dan

+0

nó thực sự khá nhẹ. ở mức cơ bản nhất, bạn có thể sử dụng nó để quản lý các gói phụ thuộc. bạn cũng có thể sử dụng nó để cung cấp dịch vụ cho các gói khác. –

0

Lợi thế mà .NET có trên Java là các thư viện được gắn chặt chẽ hơn với hệ điều hành. Thực tế là các thư viện khung, nếu chúng được cài đặt, có vị trí dễ dàng trong GAC hiện đơn giản hóa mọi thứ, nhưng bạn cũng bị giới hạn khá nhiều đối với Windows. Một so sánh tốt hơn sẽ là Mono, nhưng tôi không có kinh nghiệm ở đó.

Quản lý cấu hình, ít nhất với tôi, luôn là nỗi đau lớn trong phát triển phần mềm. Bạn càng cố gắng tận dụng lợi thế của mã hiện có, nó càng trở nên tệ hơn. Vấn đề chính nó không phải là duy nhất đối với Java, mà là sự gia tăng của các phiên bản, lượng thời gian nền tảng đã tồn tại, và số lượng các nền tảng được hỗ trợ dường như làm cho nó tồi tệ hơn. Tôi vừa kiểm tra và tôi có 3 phiên bản JRE trên hộp của tôi ngay bây giờ - và tôi thậm chí không phải là một nhà phát triển Java đang hoạt động.

Đối với câu hỏi của bạn, tôi không chắc đó có phải là tính năng cấp bách nhất hay không. Cá nhân, tôi muốn thấy một số hỗ trợ tốt hơn cho các dịch vụ web, đặc biệt là những người yêu cầu các tiêu đề xác thực. Lần cuối cùng tôi cố gắng làm cho Java tương tác với một trong các dịch vụ web .NET của tôi. Tôi gần như xé tóc ra. Có sử dụng LINQ với C# /. Net, tôi cũng có thể nói rằng đó sẽ là một bổ sung khá thú vị cho Java với khả năng đạt được nhiều năng suất hơn.

+0

Dường như ý tưởng đằng sau JSR 277 (http://www.jcp.org/en/jsr/detail?id=277) là bao gồm một số giải pháp tương tự, nhưng nó dường như không hoạt động. – Dan

+0

Tôi tin OSGi (http://www.osgi.org/Main/HomePage) đã cung cấp nhiều lợi ích của JSR 277 với lợi thế bổ sung mà nó thực sự tồn tại. Nó thậm chí không phức tạp lắm. –

0

.NET hỗ trợ các hội đồng cạnh nhau, vì vậy bạn có thể có nhiều phiên bản của cùng một ứng dụng. GAC giống như các DLL chia sẻ, nhưng bạn vẫn có thể đăng ký nhiều phiên bản của cùng một assembly tại GAC và một assembly khác có thể yêu cầu một phiên bản nào đó hoặc lớn hơn nếu tôi nhớ rõ.Trong JavaEE bạn có một số cấp độ trình nạp lớp btw và bạn có thể thực hiện một số thủ thuật mô phỏng các phiên bản tương tự

+0

Nhưng nó hỗ trợ có phiên bản khác nhau của cùng một hội đồng trong cùng một vm? –

5

Tôi cũng đã sử dụng Java trong hơn một thập kỷ nhưng tôi phải nói rằng tôi chưa tìm thấy nhiều JAR hell vấn đề ở tất cả (thậm chí sử dụng tất cả các công cụ của bên thứ ba mà bạn đề cập đến)! Tôi tìm thấy Maven là một công cụ khủng khiếp, vì vậy hãy xây dựng mọi thứ với ant.

Tại công ty chúng tôi có một bespoke phụ thuộc độ phân giải ant nhiệm vụ dựa trên một đơn giản (nhỏ) tập tin phụ thuộc cho từng dự án, cùng với việc xác định từng dự án hoặc như một app hoặc một lib (bạn chỉ nên bao giờ phụ thuộc vào một lib ; không bao giờ là app). Nó hoạt động tốt.

Chúng tôi cũng có các nhiệm vụ ant để sửa đổi nhật thực của chúng tôi .classpath và IDEA .iml tệp để tạo biểu đồ phụ thuộc cho các IDE của chúng tôi.

+0

Bạn có thể tìm thấy giá trị của Ivy kết hợp với hệ thống xây dựng của bạn. Về cơ bản nó có các cơ chế phân giải phụ thuộc của maven trong khi loại bỏ phần còn lại - http://ant.apache.org/ivy/ – Evan

+0

Cũng nên đề cập, nó cũng có một plugin cho Eclipse - http://ant.apache.org/ivy/ivyde/ – Evan

+0

Rất vui khi thấy tôi không phải là người duy nhất làm mướn ... –

0

Tôi gặp vấn đề này tại một trang web tôi đã làm việc: xây dựng một công cụ để chạy qua các tệp jar trên máy chủ web và tìm tất cả các tệp lồng nhau của tệp jar - và các tệp khác nhau có cùng tên (ví dụ: phiên bản của log4j.jar). Đó là một mớ hỗn độn ghê gớm, bao gồm một WAR có jar WebLogic bên trong nó.

Không chắc chắn giải pháp là gì.

Thing là: java nội dung để quản lý tệp jar được đóng dấu này với các phiên bản gói. Và đặc biệt là: webstart. Có lẽ điều cần thiết là một loại trình nạp lớp thực hiện một điều kiểu webstart.

Làm thế nào về: trong tệp kê khai JAR, bạn chỉ định phụ thuộc thư viện, sử dụng tên và phiên bản nổi tiếng. Trình nạp lớp - được cung cấp bởi vùng chứa hoặc thời gian chạy - sẽ chịu trách nhiệm nhận các phiên bản bạn muốn.

Có rất nhiều hệ thống (ví dụ: Maven chính nó) để quản lý các địa điểm nổi tiếng để tải xuống thư viện từ, cũng như fink và whatnot.

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