Gradle, nguồn sourceCompabilities tương ứng với vs target TargetCompabilities


130

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

Theo tài liệu của Gradle :

sourceCompatibilitylà "Khả năng tương thích phiên bản Java để sử dụng khi biên dịch nguồn Java." targetCompatibilitylà "Phiên bản Java để tạo các lớp cho."

Sự hiểu biết của tôi là targetCompatibilitysẽ tạo ra mã byte java tương thích với một phiên bản Java cụ thể, đây có phải là tập hợp con của chức năng sourceCompatibilitykhông?

Câu trả lời:


80

targetCompatibilitysourceCompatibilitybản đồ đến -target release-source releasetrong javac. Nguồn về cơ bản là cấp độ ngôn ngữ nguồn và đích là cấp độ của mã byte được tạo.

Thông tin chi tiết có thể được tìm thấy trong phần javac phần biên dịch chéo .


1
Liên kết trên đang trỏ đến doc cho Java 7. Tôi tự hỏi liệu bạn có muốn một cái gì đó như docs.oracle.com/en/java/javase/11/tools/ không?
Brian Agnew

62

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

Chỉ vì bạn sử dụng sourceCompability (hoặc targetCompabilities) 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 với JDK 1.6 và mong muốn 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 tình cờ gọi một số phương thức chỉ có sẵn trong JDK 1.6, nó vẫn sẽ biên dịch với các tùy chọn Tương thích khác nhau cho VM đích. Nhưng khi bạn chạy nó, nó sẽ thất bại vì không có phương thức vi phạm (bạn sẽ nhận được một Phương thứcNotFoundException hoặc ClassNotFoundException).

Vì lý do này, tôi luôn so sánh cài đặt Tương thích với phiên bản Java thực tế mà tôi đang xây dựng. Nếu chúng không khớp, tôi sẽ thất bại trong quá trình xây dựng.


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

Làm thế nào để bạn so sánh chúng?
zero01alpha

Tại sao bạn thất bại trong việc 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

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())Đây là cách tôi sắp xếp vấn đề này, ngay khi bắt đầu tập tin build.gradle.
Xerus

2
Do Java 9 hiện có một javactùy chọn mới --releasenhằm giải quyết vấn đề này, bằng cách chỉ cho phép sử dụng API có sẵn trong phiên bản Java được chỉ định. Để biết thêm về điều này, hãy xem stackoverflow.com/a/43103038/4653517
James Mudd

35

sourceCompabilities = chỉ đị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 các tệp .java . ví dụ sourceCompabilities 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 sourceCompabilities = "phiên bản của JVM hiện tại đang sử dụng" và targetCompabilities = sourceCompabilities

targetCompabilities = Tùy chọn đảm bảo rằng các tệp lớp được tạo sẽ tương thích với các VM được chỉ định bởi targetCompabilities. 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.

Các tệp lớp sẽ chạy trên mục tiêu được chỉ định bởi targetCompabilities và trên các phiên bản mới hơn, nhưng không phải trên các phiên bản trước của VM


Làm thế nào để chúng tôi tìm ra những dự án của chúng tôi đang sử dụng?
isJulian00

0

Theo ý kiến ​​của tôi, nguồn sourceCompabilities, có nghĩa là tính năng bạn có thể sử dụng trong mã nguồn của mình. Ví dụ: nếu bạn đặt sourceCompabilities thành 1.7, thì bạn không thể sử dụng biểu thức lambda, một tính năng mới trong java 8 mặc dù phiên bản jdk của bạn là 1.8.
Đối với mục tiêu tương thích trực tiếp, có nghĩa là phiên bản nào của tệp lớp được tạo có thể chạy được, nếu bạn đặt nó thành 1.8, nó có thể không chạy thành công trên jdk 1.7, nhưng nó thường có thể chạy trên phiên bản cao hơn của jdk.


0

Đây là những cờ cho lệnh javac.

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

Nói cách khác: bạn viết mã trong một sourcephiên bản và biên dịch các lớp của bạn thành targetphiên bản VM. Để chạy nó, ví dụ như trên các máy trạm khác với phiên bản java cũ hơn.

Theo: https://docs.oracle.com/en/java/javase/11/tools/javac.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.