Câu hỏi ngắn gọn: Nếu tôi sử dụng các tính năng ngôn ngữ Java 7 tương đối nhỏ trước đây không có trong Java 6, chẳng hạn như khối try-muticatch ... điều này có nghĩa là chương trình của tôi sẽ không chạy trong máy với JRE 6 hoặc JRE 5 được cài đặt sau khi được biên dịch không? Nếu đó là chính xác, có cách nào nhanh chóng để tạo ra một tệp thực thi JRE6 .jar mà không thay đổi mã nguồn Java 7 (mà, bằng cách này, tính năng Java 7 duy nhất nó sẽ sử dụng là khối try-multicatch)?java 7 ngôn ngữ tương thích ngược
Trả lời
Bạn là chính xác. Multi-catch là một tính năng ngôn ngữ Java 7 và không có cách nào để biên dịch nó sang Java bytecode tương thích với Java 6 (hoặc cũ hơn).
Sử dụng một trình biên dịch Java 7, sau đây cho phép bạn biên dịch Java 6 bytecode tương thích:
javac -source 1.6 -target 1.6 MyJavaFile.java
Khi bạn cố gắng để biên dịch Java 7 tính năng ngôn ngữ (multi-catch, ví dụ), bạn sẽ nhận được:
roach$ javac -source 1.6 -target 1.6 test.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
test.java:9: error: multi-catch statement is not supported in -source 1.6
} catch (NullPointerException | BufferOverflowException ex) {}
^
(use -source 7 or higher to enable multi-catch statement)
1 error
1 warning
(để biết thêm về những gì mà warning
phương tiện, xem: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - nó không relavent cuộc thảo luận này)
Nếu bạn thay đổi -source
cờ để 1.7
bạn sẽ nhận được:
source release 1.7 requires target release 1.7
... Bởi vì bạn không thể biên dịch Java 7 nguồn (ví dụ nguồn có các tính năng Java 7) tới bytecode tương thích Java 6.
Nếu bạn biên dịch nó bằng Java 7 (không có cờ -source
hoặc -target
), bạn sẽ nhận được mã Java 7 bytecode không thể chạy trên một JVM Java 7 <. Và nếu bạn cố gắng làm như vậy, bạn sẽ nhận được thông báo lỗi cho bạn biết các phiên bản không khớp:
roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : Unsupported major.minor version 51.0
Bạn không thể biên dịch mã nguồn với Java 7 tính năng vào Java 6 .class vì đây
javac -source 1.7 -target 1.6 Test.java
sản xuất source release 1.7 requires target release 1.7
lỗi. Điều này là do một số tính năng 1.7 chỉ có thể làm việc với các lớp Java 7. Ví dụ: try-with-resources
sử dụng phương pháp Throwable.addSuppressed
chỉ có sẵn từ 1.7
- 1. OpenGL Shading Ngôn ngữ tương thích ngược
- 2. Ngôn ngữ Java có duy trì tính tương thích ngược mã nguồn trong suốt lịch sử của nó không?
- 3. Tomcat 7 có tương thích với Java 7 không?
- 4. Deserialization tương thích ngược
- 5. BackupAgent tương thích ngược
- 6. Công tắc tương thích ngược
- 7. Grails 1.3.7/Java 7 Khả năng tương thích
- 8. Khả năng tương thích ngược của lớp JDK 7 với JDK 6
- 9. Ngôn ngữ giải thích cho Javascript?
- 10. Java có nên phá vỡ khả năng tương thích ngược trong các phiên bản sau này vì lợi ích của một ngôn ngữ rõ ràng hơn không?
- 11. MS Office PIAs "tương thích ngược"
- 12. Git kho lưu trữ tương thích ngược
- 13. OpenGL Khả năng tương thích ngược
- 14. Tương thích ngược OpenGL với OpenGL ES?
- 15. WCF Service - Vấn đề tương thích ngược
- 16. ISerializable và khả năng tương thích ngược
- 17. Thông số kỹ thuật biểu tượng WPF để hỗ trợ Windows 7 và tương thích ngược
- 18. Ngữ pháp thích hợp cho ngôn ngữ này là gì?
- 19. phải sang trái Ngôn ngữ Bracket Đảo ngược
- 20. Ngôn ngữ Java + Scripting (JSR 223)
- 21. Có ngôn ngữ nào tương thích với .NET không hỗ trợ các loại chưa ký không?
- 22. Đa ngôn ngữ Ngôn ngữ
- 23. Dotfuscator loại bỏ hỗ trợ ngôn ngữ Windows Phone 7?
- 24. Tương đương mục tiêu-C của đặc tả ngôn ngữ Java hoặc tiêu chuẩn C++?
- 25. Thanh tác vụ theo ngữ cảnh tương thích với Android
- 26. JDK 1.7 phá vỡ tính tương thích ngược? (generics)
- 27. Thư viện bản dịch ngôn ngữ Java
- 28. Ngôn ngữ mẫu JavaScript và Java chéo?
- 29. Tôi có thể tìm thấy tập tin ngữ pháp chính thức cho ngôn ngữ lập trình Java 7 ở đâu?
- 30. Ngữ âm Java hoặc phát âm ngôn ngữ