2012-01-24 41 views
12

Tôi biết một chút thông tin về JDK và JRE nguồn và khả năng tương thích nhị phân (ví dụ thisthis), nhưng không chắc chắn về tình hình sau:JDK, JRE một khả năng tương thích lọ

Cân nhắc tôi có một ứng dụng được biên dịch sử dụng JDK5 và chạy trên JRE6. Nó sử dụng một số thư viện (lọ) cũng được biên dịch bằng cách sử dụng JDK5.

Bây giờ tôi muốn biên dịch ứng dụng của mình bằng JDK6. Những vấn đề mới có thể phát sinh trong thời gian chạy trong trường hợp này (đặc biệt, trong khả năng tương thích với các lọ "cũ")? Tôi có nên thử lại hoàn toàn ứng dụng (chạm vào mọi thư viện) hay có thể dựa vào khả năng tương thích JDK/JRE đã hứa không?

+0

có thể trùng lặp của [Có bất kỳ ví dụ cụ thể nào về sự không tương thích ngược giữa các phiên bản Java không?] (Http://stackoverflow.com/questions/1654923/are-there-any-specific-examples-of-backward-incompatibilities-between -java-versi) –

Trả lời

2

Cho đến khi và trừ khi bạn không thay đổi mã của mình và thêm các tính năng Java 6 mới, sẽ không có vấn đề gì. Đối với các lọ khác, không có vấn đề gì cả. JDK luôn duy trì tính tương thích ngược.

+0

"_JDK luôn duy trì tính tương thích ngược" "Ít nhất là gây hiểu nhầm: Xem câu hỏi được liên kết trong các nhận xét cho OP. – Alberto

2

Tính tương thích chủ yếu hoạt động. Tôi sẽ không mong đợi bất kỳ vấn đề nào cho bạn phát sinh ngoài một số cảnh báo khác nhau cho ví dụ: không sử dụng Generics. Có thể một số API được sử dụng hầu như không được chấp nhận, nhưng tôi cho rằng chúng đã được đặt đúng vị trí, chỉ được đánh dấu là không dùng nữa.

Chỉ cần dùng thử, nếu nó biên dịch bạn nên vẫn ổn.

Một khía cạnh thiết kế quan trọng của Java - thật không may - là khả năng tương thích ngược hoàn toàn.

Có rất ít ngoại lệ trong đó khả năng tương thích ngược không được bảo toàn; nổi bật nhất của Eclipse là khi thuật toán sắp xếp được thay đổi từ một thuật toán ổn định thành một thuật toán sắp xếp không ổn định (thứ tự của các đối tượng phân loại giống hệt nhau không còn được bảo tồn); nhưng đó không bao giờ là một phần của đặc tả Java, nhưng là một lỗi trong Eclipse.

Thật không may, bởi vì có một vài lựa chọn không tốt mà bây giờ không thể thay đổi. Iterator không được có chức năng remove() trong API, Vector không được đồng bộ hóa (được giải quyết bằng cách có ArrayList bây giờ), StringBuffer không được đồng bộ hóa, do đó StringBuilder. String có lẽ phải là một giao diện, không phải là một lớp, để cho phép, ví dụ: Chuỗi 8 bit, chuỗi 32 bit - CharSequence là giao diện chuỗi tốt hơn, nhưng có quá nhiều phương thức không chấp nhận CharSequence và yêu cầu trả lại String. Observable cũng là một giao diện: bạn không thể tạo một phân lớp có thể quan sát được với API này. Đến tên một vài. Nhưng vì khả năng tương thích ngược, chúng không thể được cố định nữa cho đến khi có thể mô đun hóa JDK (tại thời điểm đó một số có thể ít nhất biến mất thành một mô-đun không sử dụng ...).

Tất nhiên bạn nên đã có hàng ngàn đơn vị kiểm tra để giúp bạn thử nghiệm với JDK mới ... :-)

+0

VÀ CSONG bạn cũng nên cố gắng thực thi đơn vị đã biên dịch, nếu nó có thể thực thi được .. bằng cách sử dụng máy ảo Java dự kiến ​​sẽ khởi chạy sản phẩm được sử dụng trong sản xuất. Bằng cách đó, tôi đoán, tôi kiểm tra khả năng tương thích. – Victor

+0

Để công bằng, "_Chỉ thử nó, nếu nó tuân thủ [sic] bạn nên được fine_" âm thanh với tôi như một cách tiếp cận quá nguy hiểm: Tôi vẫn sợ những vấn đề bất ngờ trong thời gian chạy. Vì vậy, -1 (mà tôi không thể hoàn tác mà không cần chỉnh sửa câu trả lời) vẫn giữ. – Alberto

+0

Java có yêu cầu tương thích ngược cao. Họ có nghĩa vụ phải có một bộ thử nghiệm rộng rãi, quá. Vì vậy, trừ khi họ đã làm một số hacks xấu xí trở lại sau đó, mã vẫn nên tương thích; bởi vì tất cả các phương pháp vẫn nên ở đó, giống như chúng. Và nếu họ không viết các bài kiểm tra ... –

9

Thông thường không có vấn đề phát sinh nên nếu bạn thiết lập các tùy chọn trình biên dịch của JDK6 để sử dụng 1.5 khả năng tương thích nguồn. Tuy nhiên đôi khi điều này không phải lúc nào cũng đúng.

Tôi nhớ một lần khi biên dịch mã 1.4 với trình biên dịch 1.5 (sử dụng 1.4 khả năng tương thích). Các lọ nơi ok (1,4 mức độ nhị phân) nhưng ứng dụng bị hỏng do chuyển đổi buồn cười.

Chúng tôi đã sử dụng số BigDecimal chuyển số nguyên làm đối số cho hàm tạo. Chỉ 1.4 version chỉ có một hàm tạo từ double nhưng 1.5 version có cả hai, các nhà thầu intdouble. Vì vậy, khi biên dịch với trình biên dịch 1.4 đã thực hiện chuyển đổi tự động từ int thành double, nhưng với trình biên dịch 1.5, nó đã kiểm tra rằng trình xây dựng int tồn tại và không nhận ra chuyển đổi đó. Sau đó, khi sử dụng mã tương thích nhị phân hoàn hảo trên 1,4 JRE, chương trình đã bị lỗi với NoSuchMethodException.

Tôi phải thừa nhận rằng đó là một trường hợp lạ, nhưng nó là một trong những trường hợp mà logic không hoạt động. Vì vậy, lời khuyên của tôi là nếu bạn có kế hoạch biên dịch cho các phiên bản cũ hơn của JRE, hãy thử sử dụng JDK phiên bản đích bất cứ khi nào có thể.

+0

@Igor, Từ tài liệu tương thích JDK: 7. Java SE 6 từ chối các hành vi bất hợp pháp Việc triển khai diễn xuất tuân thủ chặt chẽ hơn với Đặc tả ngôn ngữ Java. Nói chung, điều này có nghĩa là javac sẽ chấp nhận nhiều chương trình hơn. Tuy nhiên, trong một số trường hợp hiếm hoi, javac hiện có thể từ chối các chương trình đã được chấp nhận trước đó, nhưng không chính xác. http://www.oracle.com/technetwork/java/javase/compatibility-137541.html#incompatibilities Thực ra tôi có 1 vấn đề như vậy. – alexsmail

+1

Tất nhiên họ có thể đã cải thiện các vấn đề tương thích. Trường hợp của tôi là 1,4-> 1,5 di cư. Và 1,3-> 1,4 thậm chí còn tồi tệ hơn (1,3 đã bị hỏng nặng) –

+0

Xin lỗi vì đã khôi phục vấn đề này - Tôi đã đọc sai câu hỏi và bỏ phiếu, và sau khi đọc lại, tôi cảm thấy bị buộc phải hoàn tác phiếu bầu của mình-- Tôi không chắc chắn rằng tình huống được mô tả phù hợp với OP. Bạn có đang chỉ nói về khả năng tương thích nguồn ('-source'), hay cả về khả năng tương thích đích (' -target')? Và bạn đã đề cập bạn đã biên dịch với một JDK5 để chạy trong một JRE1.4. OP biên dịch với JDK5 cho JRE6 và nâng cấp để biên dịch với JDK6 cho JRE6. Tình hình của bạn có vẻ khác nhiều. Nhưng nếu bạn không nhớ, hãy quên nó đi (tôi đã upvoted, và điều này vẫn có thể phục vụ như là cảnh báo cho người khác) – Alberto

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