2012-05-19 65 views
27

Khi sử dụng trình biên dịch Java (javac), chúng tôi có thể chỉ định hai loại khả năng tương thích. Một người đang sử dụng -source và người kia đang sử dụng -target. sự khác biệt giữa hai cái đó là gì?sự khác nhau giữa khả năng tương thích nguồn và -target là gì?

Ví dụ: -source 1.5-target 1.6?

Ngoài ra, có trường hợp nào chúng tôi sử dụng một mức độ tương thích nguồn và mục tiêu khác không?

Trả lời

21

Từ javac docs:

-source Specifies the version of source code accepted.

-target Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM.

Trong ví dụ của bạn:

-source 1.5 and -target 1.6 

này sẽ được sử dụng để đảm bảo rằng mã nguồn tương thích với JDK 1.5, nhưng sẽ tạo ra các file lớp để sử dụng trên JDK 1.6 trở lên.

Khá lý do tại sao bạn sẽ làm điều này là một vấn đề khác.

+2

Lưu ý rằng tôi đã thấy rằng 'javac' không hỗ trợ tất cả các kết hợp. Ngoài ra tôi thực sự có một trường hợp sử dụng. Trong Java 6 JAX-WS được xây dựng trong, vì vậy tôi muốn có một giải pháp làm việc trên đồng bằng Java 6 mà không cần thêm các thư viện. Giải pháp đó sau đó cần cho một vài khách hàng có thể thực thi trên Java 5 JVM (và JAX-WS được đưa vào bên) và cú pháp '@ Override' đã thay đổi để nó không được biên dịch ngay lập tức bằng Java 5 javac. (Đây là tiền maven, nó có thể dễ dàng hơn để làm hôm nay) –

+0

Xem thêm '-bootclasspath' như mô tả thêm trong [câu trả lời này] (http://stackoverflow.com/a/10663478/418556). –

+1

@skaffman - * "Khá lý do tại sao bạn sẽ làm điều này là một vấn đề khác ..." * - Java cố gắng diễn giải ý kiến. Nếu ngôn ngữ không được thiết lập đúng, thì biên dịch có thể thất bại vì một nhân vật bất hợp pháp trong các bình luận !!! Đôi khi nó dễ dàng hơn để cho trình biên dịch ngừng giải thích các nhận xét sau đó, nói, sửa thông báo bản quyền trong hàng trăm tệp. – jww

10

-source cho biết mức độ tuân thủ mà mã nguồn của bạn có: bạn có đang sử dụng chú thích không? Sau đó, bạn sẽ cần ít nhất 1.5; bạn đang sử dụng @override để triển khai giao diện, bạn sẽ cần 1.6 vv

Chỉ định phiên bản Java bạn muốn có thể chạy lớp học của mình. Bạn có thể sử dụng trình biên dịch và biên dịch Java SE 7 để chạy trên Java SE 1.5.

7

Điều này chủ yếu là hữu ích để tạo tệp jar hoạt động với phiên bản Java cũ hơn. Tôi tin rằng cho đến nay tất cả các JDK có thể thực thi phiên bản cũ hơn, vì vậy không có lý do thực sự nào để có mục tiêu lớn hơn nguồn.

Tuy nhiên, bạn nên đặt target thành ví dụ: 1,6 khi sử dụng 1,7 JDK.

Tôi không chắc chắn, nhưng tôi tin rằng nó có thể làm việc trong một số tình huống để biên dịch mã 1,7 java sử dụng một trình biên dịch 1,7 đến một jar 1.6, cho các biểu thức ví dụ như

ArrayList<Integer> foo = new ArrayList<>(); 

rằng chỉ có giá trị trong phiên bản nguồn 1,7+ nên biên dịch thành 1,6 mã byte tương thích. Nhưng tôi đã không xác minh xem trình biên dịch sẽ thực sự làm điều này. Thật không may, điều này dường như không được thực hiện trong thực tế.

+2

Trong khi đó là một lý thuyết tốt đẹp nó sẽ không thực sự làm điều này trong thực tế. Nếu bạn cố gắng nguồn 1.7 và mục tiêu 1.6, bạn sẽ nhận được lỗi này: "nguồn phát hành 1.7 yêu cầu phát hành mục tiêu 1.7" – Tomas

+4

Tôi tìm thấy những gì @Tomas nói là đúng. Điều gì là khó chịu, vì đó có vẻ là sự kết hợp hữu ích nhất? Nó ngăn cản bạn viết thư viện trong 1,7 cấp nguồn có thể được liên kết trong 1,6 dự án. Có giải pháp nào cho điều này không? – Matthias

+0

@Matthias Không có vấn đề gì trong việc liên kết các thư viện từ các phiên bản lớp khác nhau. Lý do duy nhất để sử dụng '-target 1.6' là nếu JVM chạy mã là 1.6. – Nayuki

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