2015-04-22 5 views
1

В разговоре с кем-то другим они утверждали, что версия JDK, используемая для компиляции кода, не имеет значения в сравнении с версией JVM, используемой для запуска скомпилированного кода.Используется ли версия JDK для компиляции кода?

Это кажется странным для меня - нет ли случаев, когда имеет значение версия JDK? Является ли функциональность всегда зависящей только от JVM, на котором работает код, а не на том, как компилируется код?

https://stackoverflow.com/a/19554706/2687324 говорит о совместимости в обратном направлении. Является ли код Java также совместимым?

+1

Вы говорите о ситуации, когда вы * не * используете '-target' или' -source' при компиляции? –

+0

Я не могу подтвердить - кто-то пишет код. Более того, даже если бы они использовали эти теги, они не знали бы, какие значения использовать, поскольку они никогда не спрашивали ... – neverendingqs

ответ

5

Нет, вы не можете запускать код, скомпилированный с новым JDK на старой JRE. Скомпилированные классы содержат номер версии для формата файла класса; если он новее, чем ожидает среда выполнения, он откажется загружать класс.

Большинство компиляторов Java поддерживают возможность настроить таргетинг на старую JRE, создавая формат файла более старого класса, чем был создан компилятор. Тем не менее, вы все равно можете столкнуться с трудностями, если не будете компилироваться с более старой версией библиотеки времени выполнения Java. В вашем коде может использоваться новый API, который не находится в старой версии Java. Компилятор с его текущей версией API не поймает это, даже если вы укажете более старую цель.

Для стандартного javac компилятора в OpenJDK эти опции: -target и -bootclasspath. Возможно, вы также захотите установить опцию -source, чтобы поймать использование новых языковых функций, которые требуют поддержки старых файлов классов.

+0

Значит, имеет значение, какая версия JDK используется для компиляции кода? Я хочу свести к минимуму риск. Значит ли это, что лучше использовать одну и ту же версию JDK для компиляции кода в качестве версии JVM для запуска кода (или, по крайней мере, той же основной версии)? – neverendingqs

+0

Опция '-target' хорошо поддерживается и используется часто. Однако я не могу оценить ваш риск. Если вас беспокоит раскат реактора, вероятно, вы должны запустить свой код в JRE, который был распространен вместе с вашим JDK. Но, когда речь идет о менее тяжелых последствиях, «-target» является общепринятой практикой. – erickson

+0

Я получаю скомпилированный код от этого человека, и они заявили, что неважно, какую версию JDK я использую. Я подозреваю, что они не используют '-target' для версии JVM, которую я использую, поскольку они никогда не спрашивали. – neverendingqs

Смежные вопросы