2013-05-20 19 views
66

Mối quan hệ/sự khác biệt giữa sourceCompatibilitytargetCompatibility là gì? Điều gì sẽ xảy ra khi chúng được đặt thành các giá trị khác nhau?Gradle, "sourceCompatibility" vs "targetCompatibility"?

Theo Gradle documentation:

sourceCompatibility là "Java phiên bản tương thích để sử dụng khi biên dịch mã nguồn Java." targetCompatibility là "phiên bản Java để tạo lớp học cho".

Hiểu biết của tôi là targetCompatibility sẽ tạo java bytecode tương thích với phiên bản Java cụ thể, đây có phải là tập con của chức năng của sourceCompatibility không?

Trả lời

44

bản đồ này đến javac - xem the cross compilation section - nguồn cơ bản là cấp độ ngôn ngữ nguồn và đích là cấp của mã byte được tạo.

31

Hãy cẩn thận khi bạn sử dụng chúng; chúng tôi bị những người đưa ra giả định cắn.

Chỉ vì bạn sử dụng sourceCompability (hoặc targetCompatibility) của 1,5 không có nghĩa là bạn luôn có thể biên dịch mã của mình bằng JDK 1.6 và mong đợi nó hoạt động theo JDK 1.5. Vấn đề là các thư viện có sẵn.

Nếu mã của bạn xảy ra để gọi một số phương thức chỉ khả dụng trong JDK 1.6, nó sẽ vẫn biên dịch với các tùy chọn Tương thích khác nhau cho máy ảo mục tiêu. Nhưng khi bạn chạy nó, nó sẽ thất bại vì phương thức vi phạm không có mặt (bạn sẽ nhận được một MethodNotFoundException hoặc ClassNotFoundException).

Vì lý do này, tôi luôn luôn so sánh cài đặt Khả năng tương thích với phiên bản Java thực tế mà tôi đang xây dựng. Nếu họ không phù hợp, tôi không xây dựng được.

+2

Đây là một sự quan sát tinh tế, nhưng rất quan trọng. – Natix

+0

Bạn so sánh chúng như thế nào? – zero01alpha

+0

Tại sao bạn không xây dựng? Tùy chọn "bootstrap classpath" được đưa ra chỉ để giảm thiểu vấn đề này. Bạn luôn có thể sử dụng bootstrap thích hợp và nó sẽ hoạt động tốt. – Codebender

17

sourceCompatibility = xác định rằng phiên bản của ngôn ngữ lập trình Java được sử dụng để biên dịch java tập tin. ví dụ: sourceCompatibility 1.6 = chỉ định rằng phiên bản 1.6 của ngôn ngữ lập trình Java được sử dụng để biên dịch các tệp .java.

Theo mặc định sourceCompatibility = "phiên bản của JVM hiện tại sử dụng" và targetCompatibility = sourceCompatibility

targetCompatibility = Tùy chọn đảm bảo rằng các tập tin lớp được tạo ra sẽ tương thích với các máy ảo theo quy định của targetCompatibility. Lưu ý rằng trong hầu hết các trường hợp, giá trị của tùy chọn -target là giá trị của tùy chọn -source; trong trường hợp đó, bạn có thể bỏ qua tùy chọn -target.

file Class sẽ chạy trên mục tiêu được xác định bởi targetCompatibility và trên các phiên bản sau này, nhưng không phải trên phiên bản trước của VM