Есть ли практическое обоснование для принудительного применения версии JDK для сборки? - PullRequest
0 голосов
/ 02 февраля 2019

Существует плагин maven inspecer , который может принудительно запускать сборку только для конкретной версии JDK.

Интересно, есть ли практические аргументы в пользу этого?Мы уже создали конфигурацию для указания исходной и целевой версий.Насколько я понимаю, этого должно быть более чем достаточно, потому что Java имеет обратную совместимость.Например, как это выглядит в Gradle:

compileJava   {
  sourceCompatibility = '1.8'
  targetCompatibility = '1.8'
}

Вот как это выглядит в Maven:

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

Если вы видели какие-либо причины требовать точную версию JDK - не могли бы вы также написатьэто вниз.

UPD.Вопрос больше в том, есть ли практическая разница для компиляции проекта java source / target версии 8 с JDK 8,9,10 или 11 ...

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Основной причиной этого могут быть некоторые улучшения оптимизации в компиляторе более нового JDK.Таким образом, даже если целевой байт-код level такой же, как и у более старого компилятора, сам целевой байт-код может быть улучшен.

Согласно Брайану Гетцу , это тянет егоweight:

Бывают моменты, когда благодаря JVM-улучшениям возможен лучший перевод из исходного кода в байт-код.Например, до 5 Foo.class было переведено на рефлексивный вызов;затем в LDC.

Итак, вы можете разумно придерживаться определенного языкового уровня в организации (из-за общего кода), но определенные приложения могут все же воспользоваться преимуществами улучшений ВМ.


Редактировать : Извините!В цитируемом твите речь идет о компиляции с источником ниже , чем целевым (например, -source 8 -target 11), поэтому он отличается от того, о чем спрашивал ОП.Тем не менее, возможно, более новый компилятор может создавать лучший байт-код, даже если цель остается неизменной.


PS.В соответствии с рекомендациями Basil позвольте мне упомянуть флаг javac --release в JDK 9+, который не позволяет использовать API более новых JDK при одновременном использовании более старых языковых уровней.

0 голосов
/ 03 февраля 2019

Ну, есть несколько причин.Единственное, на что я хотел бы обратить внимание - это развертывание в корпоративной среде.

Допустим, в вашей компании работают тысячи обслуживаемых машин, вы просто не можете установить каждую отдельную версию Java на каждом компьютере.Кроме того, безопасность обычно не позволяет скачивать (часто вообще не имеет прямого доступа к Интернету), и необходимо поддерживать каждую доступную версию Java в отношении безопасности - с большим количеством документов и обсуждений (например, безопасности).

Botomline - это: На предприятии у вас очень ограниченный набор доступных версий Java и зачастую нет передового края.

Теперь предположим, что доступной версией является Java 8. Теперь, если вы хотитеприложение, которое нужно запустить в среде, вы должны убедиться, что оно действительно работает в доступной версии (например, Java 8).Если он будет использовать что-то, что недоступно в этой версии, он просто не будет работать или зависать.По сути, такое приложение просто не может быть использовано на предприятии.Это означает, что предприятие будет искать другое решение, которое оно может использовать в своей среде.

Таким образом, возможность сообщить компилятору целевую версию очень помогает в создании приложения, которое может и будет фактически использоваться (и не аварийно завершает работу на компьютере пользователя).

0 голосов
/ 02 февраля 2019

Совсем нет. Источник в основном о синтаксисе. Target относится к конкретному магическому числу и возможностям байт-кода.

Но вы вполне могли бы написать код, соответствующий Java 7, который использует один класс X, который обеспечивает только jdk 8 или новее.Когда вы затем используете Java 8 jdk, этот компилятор найдет этот класс X и соберется нормально.Но при запуске этого кода на Java 7 jvm класс Java 8 отсутствует, что приводит к исключению времени выполнения.

Итак: принудительное использование jdk не позволяет использовать классы, добавленные в Java после целевой версии,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...