2011-10-21 26 views
13

Gần đây tôi đã chuyển sang Java 7 trong một trong các dự án của tôi. Tôi cho rằng nó có thể chạy trên Java 1.5 đơn giản chỉ vì không có gì tôi phụ thuộc vào đó là trong Java 6 hoặc 7. Tuy nhiên khi biên dịch hôm nay tôi nhận thấy điều này:Việc biên dịch cho Java 1.5 trên Java 1.7 vẫn hoạt động?

bootstrap class path not set in conjunction with -source 1.5 

Google đã tìm thấy ít thông tin về cảnh báo này. Điều này có nghĩa là bạn không thể biên dịch sang Java 1.5 từ Java 1.7?

+0

Không chắc chắn về thông báo lỗi, nhưng tôi sẽ có các bài kiểm tra đơn vị tự động chạy đối với từng phiên bản Java (1.x) quan trọng mà tôi yêu cầu hỗ trợ. –

Trả lời

13

blog của Oracle này giải thích những cảnh báo:

http://blogs.oracle.com/darcy/entry/bootclasspath_older_source

Lý do là, nếu bạn không đặt rt.jar cho nền tảng cũ, sau đó:

Nếu bước thứ hai không được thực hiện, javac sẽ sử dụng các quy tắc ngôn ngữ cũ kết hợp với các thư viện mới, điều này có thể dẫn đến các tệp lớp không hoạt động vào thứ hai e nền tảng cũ hơn vì các tham chiếu đến các phương thức không tồn tại có thể được bao gồm.

6
  1. Bạn nên đặt nguồn và mục tiêu 1.5.

  2. Để thực sự chắc chắn rằng bạn không vô tình kết hợp các phụ thuộc vào các lớp, phương thức hoặc trường mới hơn, hãy sử dụng plugin maven-animal-sniffer hoặc một cái gì đó tương tự.

+2

+1 vì tôi chưa bao giờ nghe nói về maven-animal-sniffer trước đây và ước gì tôi đã làm nhiều lần. (Môi trường kiểm tra bài tập đại học chưa được cập nhật trong 10 năm = argh.) – millimoose

+2

Tôi nghĩ rằng nó cũng được khuyến khích để đặt '-target 1.5'. Tôi nghĩ rằng các phiên bản định dạng classfile số đã va chạm giữa 1,5 và 1,6, do đó, một máy ảo 1,5 có thể không thể tải chúng. (Thậm chí nếu không, tốt hơn là an toàn hơn xin lỗi.) – millimoose

+0

nếu '-source' và' -target' được xác định, trình biên dịch 1.7 sẽ nhắc cho '-xbootclasspath' - tài khoản cho điểm 2. –

12

Điều này có nghĩa là bạn không thể biên dịch sang Java 1.5 từ Java 1.7?

Không. Nó có nghĩa là có một cách đúng đắn và một cách sai lầm để làm điều này ... và bạn đang làm điều đó một cách sai lầm.

Cách đúng để biên dịch cho Java 1.5 trên Java 1.7 JDK là:

  • Nhận giữ một bản sao của "rt.jar" từ Java 1.5 và đặt nó trên bootclasspath biên dịch.

  • Biên dịch với nguồn 1,5 và mục tiêu 1,5.

Thông điệp cảnh báo cho bạn biết rằng bạn chưa thực hiện thao tác đầu tiên.


Cách bạn đang xây dựng ngay bây giờ là ngầm sử dụng phiên bản 1.7 của "rt.jar" cho API thời gian chạy Java. Điều này có thể hoạt động! (Thật vậy, nó nên làm việc giả định rằng bạn đã không thực hiện thay đổi mã kể từ lần cuối được xây dựng trên 1.5.) Tuy nhiên, có nguy cơ bạn vô tình giới thiệu các phụ thuộc vào các lớp hoặc các phương thức được thêm vào trong Java 1.6 hoặc 1.7. Điều đó sẽ dẫn đến lỗi thời gian chạy khi bạn cố chạy ứng dụng của mình trên Java 1.5.

2

- nguồn 1.5 sẽ đảm bảo các tệp nguồn tuân thủ quy ước Java 5. --target 1.5 sẽ đảm bảo các tệp lớp được tạo tuân thủ các quy ước Java 5.Cả hai cách này sẽ không bảo vệ bạn khỏi việc sử dụng các phương thức thư viện Java 6 hoặc 7. Bạn phải biên dịch với rt.jar thích hợp bằng cách sử dụng --bootclasspath, hoặc sử dụng một cái gì đó giống như plugin động vật-sniffer (nếu bạn đang sử dụng maven), nó sẽ kiểm tra chữ ký của mọi thứ và so sánh với các cấu hình đã xuất bản.

Với động vật sniffer-plugin, bạn có thể trong một điều trị, bởi vì bạn có thể va vào thư viện của bên thứ 3 mà sử dụng Java 6 API, mà có thể gây ra quá trình xây dựng của bạn sẽ thất bại cho bạn đang theo đuổi Java 5.

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