2012-04-11 38 views
23

Vì Java 6 SE JRE công khai đang tiến gần hơn đến EOL (Nov '12), tôi đang xem xét việc chuyển các dự án của tôi từ Java 6 sang Java 7. Điều này sẽ không là vấn đề lớn nếu Apple cung cấp Java 7 JRE dành cho Mac OS X. Nhưng vì Apple không sẵn sàng làm như vậy, tôi vẫn phải hỗ trợ người dùng chỉ có Java JRE.Có thể biên dịch các tệp lớp với SDK Java 7 có thể chạy trên Java 6 JVM không?

Có cách nào để biên dịch các tệp nhị phân tương thích Java 6 (tệp lớp) với Java 7 javac không? Chắc chắn tôi biết rằng tôi không thể sử dụng các tính năng Java 7 mới khi làm như vậy.

Cảm ơn bạn đã dự đoán!

+1

Related: http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias

+0

có thể trùng lặp của [Set ant bootclasspath: JDK 1.7 có một cảnh báo javac mới để thiết lập một nguồn cũ hơn mà không có bootclasspath] (http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-cảnh báo-cho-thiết-một-cũ-chua) –

+0

Bản sao của http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze

Trả lời

21

Điều đó tùy thuộc. Nếu chương trình của bạn không sử dụng các phần mở rộng ngôn ngữ Java 7 mới, thì bạn có thể chạy trình biên dịch Java với các tùy chọn -source 1.6-target 1.6. Nhưng nếu bạn sử dụng các phần mở rộng ngôn ngữ Java 7 thì -source 1.6 sẽ dẫn đến lỗi biên dịch.

Chắc chắn tôi biết rằng tôi không thể sử dụng các tính năng Java 7 mới khi làm như vậy.

Điều đó bao gồm các tính năng ngôn ngữ Java 7 ... và các phụ thuộc vào Java 7 thay đổi đối với API thư viện lớp chuẩn. Cũng cần lưu ý rằng có một số ít sự khác biệt về hành vi (còn gọi là sửa lỗi API) có thể khiến mã chạy khác nhau trên Java 6 và Java 7. Chúng nên được mô tả trong tài liệu chuyển tiếp Java 6 đến Java 7.


CẬP NHẬT - Điều này có lẽ không còn là một vấn đề cho bạn dù sao, bởi vì Oracle đã phát hành Java 7 cho Mac OSX.

+0

Nếu bạn vẫn gặp lỗi với điều này, bạn có thể tạm thời chuyển về Java 6. Tìm đường dẫn bằng cách chạy '/ usr/libexec/java_home -v '1.6 *''. Sau đó, đặt nó làm đường dẫn trang chủ Java bằng cách sử dụng 'export JAVA_HOME ="/path/to/java6/"'. Xác minh nó hoạt động bằng cách chạy 'java -version'. – user2398029

+0

@louism - Trên Windows và Linux (ít nhất) thiết lập JAVA_HOME không trực tiếp ảnh hưởng đến lệnh nào được chạy khi bạn chạy 'java'. Mac OSX có khác biệt không? –

+0

Có vẻ như nó! Xem gist.github.com/4394202. – user2398029

5

tôi đã cài đặt jdk6. nếu bạn kiểm tra trang người đàn ông của javac:

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      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. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

Có, nhưng trong một số trường hợp thì không. Trong java 1.6, họ không có thử với các tài nguyên, chuyển đổi với các chuỗi, hoặc nhiều câu lệnh bắt vv Vì vậy, những phần của chương trình sẽ không biên dịch. Nhưng ý tưởng về java được biên dịch một lần, chạy khắp nơi; để mã có thể hoạt động trên các JVM cũ

3

Câu trả lời của Stephen C là chính xác, nhưng chưa hoàn thành. Các chương trình Java 7 của bạn sẽ không biên dịch trong Java 6 nếu chúng sử dụng các tính năng ngôn ngữ Java 7, nhưng được cảnh báo các lỗi khác vẫn có thể xảy ra với một lập trình viên mã hóa trong Java 6 và một trình biên dịch Java khác. sql.Driver. Trong Java 7, giao diện đã đạt được một phương thức bổ sung.

Nhà phát triển Java 7 Chú thích này triển khai giao diện Trình điều khiển và sử dụng chú thích 'Ghi đè' trên phương pháp trình điều khiển bổ sung được triển khai. Chương trình biên dịch tốt như một chương trình Java 6 vì lớp mà trình biên dịch Java 6 thấy có phương thức đó và mã được kiểm tra. Biên dịch chương trình như Java 6 không có nghĩa là trình biên dịch Java 6 sẽ tự động chuyển sang sử dụng nguồn Java 6 mã!

Java 6 Developer Các nhà phát triển Java 6 cố gắng để xây dựng mã số 7 nhà phát triển Java cam kết và nhận được một lỗi biên dịch mặc dù các nhà phát triển Java 7 đã không thực hiện bất kỳ cấu trúc ngôn ngữ Java 7.

Do đó, mặc dù bạn có thể biên dịch dưới dạng Java 6, tôi khuyên bạn không nên thực hiện việc này.

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