Подключаемый модуль компилятора Maven, настроенный на Java 7, но все еще компилирующий код Java 8

В моем проекте мы собираемся использовать Java 7 для ---- +: = 0 =: + ---- и предполагаем, что после компиляции Maven весь код, использующий Java 8, не должен успешно компилироваться.Однако, в моем случае, есть файл, использующий ---- +: = 1 =: + ----, который можно использовать из Java 8, и он все еще успешно компилируется.Ниже приведен файл ---- +: = 2 =: + ----, который настраивает версию Java.Не могли бы вы взглянуть и дать мне понять, почему мои файлы все еще могут успешно компилироваться, хотя я настроил его на Java 7?Для ---- +: = 3 =: + ---- я пропускаю зависимости и так далее, и только перечисляю свойства и сборку.А для файла, который я использую в Java 8, строка выглядит примерно так:И что я хочу, так это то, что, поскольку я настраиваю версию Java на 7 в Maven и после компиляции, файл, использующий Java 8, не должен успешно компилироваться и отображать ошибки типа "... разрешены только на уровне исходного кода 1.8 или выше».
4 голоса | спросил TryMyBest 5 MonEurope/Moscow2016-12-05T22:40:50+03:00Europe/Moscow12bEurope/MoscowMon, 05 Dec 2016 22:40:50 +0300 2016, 22:40:50

2 ответа


0
---- +: = 0 =: + ---- и ---- +: = 1 =: + ---- флаги плагина компилятора, который отображается непосредственно на ---- +: =2 =: + ---- и ---- +: = 3 =: + ---- опции компилятора Java ---- +: = 4 =: + ---- (когда ониспользуется), как правило, неправильно .---- +: = 5 =: + ---- не указывает ---- +: = 6 =: + ---- скомпилировать исходные файлы Java с указанной версией JDK.Он дает команду ---- +: = 7 =: + ---- проверить версию принятого исходного кода, которая сильно отличается.Основная версия Java иногда вносит изменения в синтаксис исходного кода.Например, в Java 1.4 вы не могли написать исходный код, содержащий обобщения, например ---- +: = 8 =: + ---- ;это не было действительным.Но с Java 5 вы можете, что означает, что компилятор JDK 5 теперь принял новый тип исходного кода Java.Компилятор JDK 1.4, сталкивающийся с ---- +: = 9 =: + ---- , может только ошибаться, потому что не знает этого, когда компилятор JDK 5 принимает его совершенно.Установка параметра ---- +: = 10 =: + ---- указывает компилятору JDK 5 интерпретировать исходный код как исходный код JDK 1.4;следовательно, если бы этот код действительно содержал дженерики, он потерпел бы неудачу, потому что этот исходный код недопустим в этой версии.Это также означает, что если исходный код не содержит какого-либо специфического исходного кода для Java 5, он прекрасно скомпилируется с ---- +: = 11 =: + ---- .В приведенном здесь примере у вас есть случай, когда компилятору ---- +: = 12 =: + ---- JDK 8 дана инструкция проверить исходный код относительно Java 7. И фактически, строкане использует какой-либо конкретный исходный код Java 8.Конечно, он использует специфичные для Java 8 классы , но сам исходный код будет вполне понятен компилятору JDK 7.Там нет лямбда-выражений.Добавьте простое ---- +: = 14 =: + ---- в свой конвейер, а затем ---- +: = 15 =: + ---- выдаст ошибку, сообщив вам:лямбда-выражения не поддерживаются в ---- +: = 16 =: + ----Обнаружено, что в исходном коде используется особая функция, недоступная в наборе функций исходного кода JDK 7.На интерфейсах нет вызовов статических методов.Замените ваш конвейер Stream на ---- +: = 17 =: + ---- вместо ---- +: = 18 =: + ---- .На этот раз вы получите ошибку:статические вызовы метода интерфейса не поддерживаются в ---- +: = 19 =: + -------- +: = 20 =: + ---- не является интерфейсом, поэтому вызов статического метода ---- +: = 21 =: + ---- для этого класса является совершенно допустимым исходным кодом JDK 7,Однако ---- +: = 22 =: + ---- - это интерфейс (который, конечно, известен используемому вами компилятору JDK 8), и до Java 8 интерфейсы не могли содержатьстатические методы.Таким образом, это недействительный исходный код Java 7.Это больше похоже на это, но смысл здесь не в том, чтобы описать их все ( аннотации типов , повторные аннотации , ссылки на методы , типы пересечений в приведении ...можно увидеть их все в ---- +: = 23 =: + ---- исходный код, например ).В общем, нет никаких причин для ---- +: = 24 =: + ---- не работать с этим исходным кодом и с опцией ---- +: = 25 =: + ---- .---- +: = 26 =: + ---- еще один зверь целиком;здесь проблема не в этом, поэтому достаточно сказать, что он инструктирует ---- +: = 27 =: + ---- генерировать байт-код, предназначенный для указанной версии виртуальной машины.Это никоим образом не гарантирует, что полученный байт-код будет фактически работать с указанной версией ВМ.Если вы хотите убедиться, что опция ---- +: = 28 =: + ---- будет использоваться.Возвращаясь к задаче, которая на самом деле здесь, чтобы компиляция не удалась.С Maven у вас есть 2 решения :Разветвите компилятор и установите исполняемый файл, указывающий на компилятор JDK 7.Или (предпочтительно), используйте механизм цепочек инструментов , чтобы гарантировать, что каждый плагин Maven (осведомленный о цепочках инструментов) использует этот JDK во время сборки (например, плагин Javadoc, который использует ---- +: = 29 =: + +---- инструмент установки JDK).
ответил Tunaki 5 MonEurope/Moscow2016-12-05T23:39:17+03:00Europe/Moscow12bEurope/MoscowMon, 05 Dec 2016 23:39:17 +0300 2016, 23:39:17
0
Я согласен со всем, что заявляет @Tunaki.Вот пример конфигурации из документации maven, которая поможет вам, если вы решите использовать первый вариант.
ответил M. Rizzo 5 MonEurope/Moscow2016-12-05T23:56:12+03:00Europe/Moscow12bEurope/MoscowMon, 05 Dec 2016 23:56:12 +0300 2016, 23:56:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132