Чи можуть новіші версії JRE запускати програми Java, скомпільовані зі старими версіями JDK?


80

Це може бути дурним запитанням, але чи не зіткнувся б я з будь-якими проблемами під час запуску програм Java та пов'язаних з ними бібліотек, скомпільованих у версіях Java 1.6 та 1.7 (я компілюю за допомогою 1.7, тоді як деякі бібліотеки скомпільовані за допомогою 1.6) та запуску всієї програми в 1.7 JRE ?

Відповіді:


85

Ви не зіткнетеся з будь-якими проблемами - це магія Java -зворотно сумісна.Ви можете запускати майже весь код з Java 1 на Java 8. Немає причин, чому код Java 6 не працює на Java 8 Runtime.

Що цікаво, так це те, що для програм, написаних, скажімо, на Java 1.4, ви навіть збільшуєте швидкість при запуску їх у наступних версіях. Це пов’язано з тим, що Java постійно розвивається, причому не тільки мова, відома як „Java”, але й JVM (віртуальна машина Java). Я все ще маю вихідний код понад 10 років тому, який все ще працює, як і очікувалось в останній JVM.

Якщо ви хочете націлити, скажімо, Java 5 VM, то ви можете зробити це за допомогою інструментів Java 8 SDK. Зрештою, ви можете вказати, яку цільову ВМ ви хочете підтримувати, якщо ви пам’ятаєте, що версія 5 ВМ може не підтримувати всі функції, які підтримує ВМ версії 8.

Я щойно протестував код, який написав у Java 5, проти нової середовища виконання Java 8, і все працює, як очікувалось, тому, хоча зараз у нас є потужніша мова та час роботи, ми можемо продовжувати використовувати свої інвестиції минулого. Саме це робить Java чудовим вибором для розвитку компаній.


Отже, хоча половина моєї програми (деякі бібліотеки, якими я користуюся) скомпільована за допомогою 1.6, а інша половина - у 1.7, вона все одно буде працювати?
Шон

2
Якщо ви запускаєте його під час виконання Java 7, так. Немає причин, щоб це не працювало.
Евальд,

1
Якщо ви розробляєте за допомогою JDK 7 і компілюєте додаток як додаток JDK 7, тоді, ні, це не буде працювати у старіших версіях. Є низка причин, щоб попросити користувачів перейти до останньої версії, перш за все, причини безпеки, але також деякі проблеми з продуктивністю. Я б пішов на Java 7, якщо зможу, немає сенсу підтримувати старіші версії, якщо вам цього не потрібно.
Евальд

1
-1 MagicDraw не працює над новими версіями Java, навіть компанія зробила підручник із зниження рівня nomagic.com/files/Java%20downgrade%20tutorial.pdf
NeDark

3
Ви бачили трохи про "Ви можете запустити майже весь код з Java 1 на Java 8"? Є деякі незначні несумісності, переважно в езотеричних частинах СВМ. Загалом, Java все ще залишається дуже сумісною із зворотною стороною.
Евальд

96

Як вже відповіли, ви в основному в безпеці, і більшість продуктів та бібліотек третьої сторони просто працюватимуть. Однак існують дуже рідкісні випадки, коли між версіями JDK були введені двійкові несумісності ( такі, коли файл класу, скомпільований із використанням старішої JDK, не зможе запуститися в новій JVM ).

Офіційний список несумісності Oracle Java між версіями:

Інструмент сумісності

У комплекті з JDK 9 є інструмент jdeprscan, який перевірить сумісність, перелічить не використовувані API у вашому коді та запропонує альтернативи (!). Ви можете вказати цільову версію JDK (працює для JDK 9 , 8 , 7 і 6 ), і в ній буде вказано несумісність, характерну для вашої цільової версії.

Додатковий коментар щодо бібліотек:

Розумним правилом є використання останньої стабільної версії бібліотеки для версії JRE, на яку націлено ваше програмне забезпечення. Очевидно, ви знайдете багато винятків з цього правила, але загалом стабільність загальнодоступних бібліотек зазвичай збільшується з часом.

Звичайно, сумісність API та версій слід враховувати при зміні версій залежностей.

Знову ж таки, найпопулярніші залежності матимуть веб-сторінки, де така інформація повинна бути доступною.

Однак, якщо ви використовуєте щось більш неясне, ви можете визначити, для якого JRE були складені класи вашої залежності.

Ось чудова відповідь про те, як дізнатися версію класу . Можливо, вам доведеться спочатку розпакувати файл JAR.


12
Насправді це повинна бути правильна відповідь, оскільки НЕ є абсолютно безпечним оновлення до новішої версії Java.
dehlen

Що робити, якщо хтось не використовує жодних функцій jdk8, компілює 1.8 і націлює 1.8. Чи вдасться?
Гаурав,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.