Режимы совместимости
При миграции большой команды на новую версию, в какой-то момент может возникнуть "несовместимое состояние", когда некоторые разработчики уже обновились, а другие нет. Чтобы предотвратить ситуацию, когда одни разработчики пишут и коммитят код, который другие не смогут скомпилировать, мы предоставляем следующие командные переключатели (также доступные в IDE и Gradle/Maven):
-
-language-version X.Y- режим совместимости для версии языка Kotlin X.Y, сообщает об ошибках для всех функций языка, появившихся позднее. -
-api-version X.Y- режим совместимости для версии API Kotlin X.Y, сообщает об ошибках для всего кода, использующего более новые API из Kotlin Standard Library (включая код, сгенерированный компилятором).
Ниже, мы используем OV для "Старой версии", и NV для "Новой версии".
Предупреждения о бинарной совместимости
Если вы используете компилятор Kotlin NV и у вас в пути класса стандартная библиотека OV или библиотека рефлексии OV, это может свидетельствовать о неправильной конфигурации проекта. Чтобы избежать неожиданных проблем во время компиляции или выполнения, мы рекомендуем либо обновить зависимости до NV, либо явно указать аргументы версии API / версии языка. В противном случае компилятор обнаруживает потенциальную проблему и выводит предупреждение.
Например, если OV = 1.0 и NV = 1.1, вы можете увидеть одно из следующих предупреждений:
Runtime JAR files in the classpath have the version 1.0, which is older than the API version 1.1. Consider using the runtime of version 1.1, or pass '-api-version 1.0' explicitly to restrict the available APIs to the runtime of version 1.0.
Это означает, что вы используете компилятор Kotlin 1.1 со стандартной или библиотекой рефлексии версии 1.0. Это можно исправить несколькими способами:
- Если вы намерены использовать API из Standard Library 1.1 или языковые функции, зависящие от этих API, вы должны обновить зависимость до версии 1.1.
- Если вы хотите сохранить совместимость своего кода со стандартной библиотекой 1.0, вы можете передать
-api-version 1.0. - Если вы только что обновились до Kotlin 1.1, но пока не можете использовать новые языковые возможности (например, потому что некоторые ваши коллеги ещё не обновились), вы можете передать
-language-version 1.0, что ограничит все API и языковые функции версией 1.0.
Runtime JAR files in the classpath should have the same version. These files were found in the classpath:
kotlin-reflect.jar (version 1.0)
kotlin-stdlib.jar (version 1.1)
Consider providing an explicit dependency on kotlin-reflect 1.1 to prevent strange errors
Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath
Это означает, что у вас есть зависимость от библиотек разных версий, например, стандартная библиотека 1.1 и библиотека рефлексии 1.0. Чтобы предотвратить скрытые ошибки во время выполнения, мы рекомендуем использовать одну и ту же версию всех библиотек Kotlin. В этом случае, рассмотрите добавление явной зависимости от библиотеки рефлексии 1.1.
Some JAR files in the classpath have the Kotlin Runtime library bundled into them. This may cause difficult to debug problems if there's a different version of the Kotlin Runtime library in the classpath. Consider removing these libraries from the classpath
Это означает, что в пути класса есть библиотека, которая не зависит от стандартной библиотеки Kotlin как от Gradle/Maven зависимости, но распространяется в том же артефакте (т.е. встроена). Такая библиотека может вызвать проблемы, потому что стандартные инструменты сборки не рассматривают её как экземпляр стандартной библиотеки Kotlin, поэтому она не подпадает под механизмы разрешения версий зависимостей, и у вас могут появиться несколько версий одной и той же библиотеки в пути класса. Обратитесь к авторам такой библиотеки и предложите использовать Gradle/Maven зависимость вместо этого.
© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/evolution/compatibility-modes.html