本頁介紹 Kotlin 不同版本以及子系統(tǒng)的兼容性保證。
兼容性意味著回答這個問題:對于給定的兩個版本的 Kotlin(例如,1.2 和 1.1.5),為一個版本編寫的代碼可以與另一個版本一起使用嗎?下面的列表解釋了不同版本對的兼容模式。請注意,如果版本號較小(即使發(fā)布時間晚于版本號較大的版本)那么版本較舊。對于“舊版本”我們使用 OV,對于“新版本”使用 NV。
kotlin-stdlib-*、 kotlin-reflect-*)WARNING 級的棄用項kotlin-stdlib-*、 kotlin-reflect-*)WARNING 級的棄用項WARNING 級的棄用項可能在 NV 中提升到 ERROR 級或者 HIDDEN 級* 除去 bugs 無改動意味著如果發(fā)現(xiàn)一個重要的 bug(例如在編譯器診斷或其他地方),修復它可能會引入一個破壞性改動,但我們總是非常小心對待這樣的改動。
JVM 平臺的 Kotlin:
| Kotlin | 1.0 | 1.0.X | 1.1 | 1.1.X | … | 2.0 |
|---|---|---|---|---|---|---|
| 1.0 | - | C | BC | BC | … | ? |
| 1.0.X | C | - | BC | BC | … | ? |
| 1.1 | BC | BC | - | C | … | ? |
| 1.1.X | BC | BC | C | - | … | ? |
| … | … | … | … | … | … | … |
| 2.0 | ? | ? | ? | ? | … | - |
JS 平臺的 Kotlin:從 Kotlin 1.1 開始,補丁版本和次版本更新為語言和 API 提供向后兼容性(BCLA),但沒有 BCB。
| Kotlin | 1.0.X | 1.1 | 1.1.X | … | 2.0 |
|---|---|---|---|---|---|
| 1.0.X | - | EXP | EXP | … | EXP |
| 1.1 | EXP | - | BCLA | … | ? |
| 1.1.X | EXP | BCLA | - | … | ? |
| … | … | … | … | … | … |
| 2.0 | EXP | ? | ? | … | - |
Kotlin Scripts:補丁版本和次版本更新為語言和 API 提供向后兼容性(BCLA),但沒有 BCB。
Kotlin 可用于多個平臺(JVM/Android、JavaScript 以及即將推出的本地平臺)。每個平臺都有自己的特殊性(例如 JavaScript 沒有適當?shù)恼麛?shù)),因此我們必須相應地調(diào)整語言。我們的目標是提供合理的代碼可移植性,而不會犧牲太多。
每個平臺都可能具有特定的語言擴展(例如 JVM 的平臺類型和 JavaScript 的動態(tài)類型)或限制(例如 JVM 上與重載相關(guān)的限制),但核心語言保持不變。
標準庫提供了在所有平臺上可用的核心 API,我們努力使這些 API 在每個平臺上以相同的方式工作。除此之外,標準庫提供了平臺相關(guān)的擴展(例如,JVM 的java.io 或 JavaScript 的 js())以及一些可以統(tǒng)一調(diào)用但工作方式不同的 API(例如 JVM 和 JavaScript 的正則表達式)。
實驗性的功能,如 Kotlin 1.1 中的協(xié)程,可以從上面列出的兼容模式中豁免。這類功能需要選擇性加入(opt-in)來使用才沒有編譯器警告。實驗性的功能至少向后兼容補丁版本更新,但我們不保證任何次版本更新的兼容性(會盡可能提供遷移幫助)。
| Kotlin | 1.1 | 1.1.X | 1.2 | 1.2.X |
|---|---|---|---|---|
| 1.1 | - | BC | NO | NO |
| 1.1.X | BC | - | NO | NO |
| 1.2 | NO | NO | - | BC |
| 1.2.X | NO | NO | BC | - |
我們發(fā)布早期訪問預覽(Early Access Preview,EAP)構(gòu)建版到特殊渠道,該社區(qū)的早期采用者可以試用它們并提供反饋。這樣的構(gòu)建不提供任何兼容性保證(盡管我們盡最大努力保持它們與發(fā)行版以及彼此之間的合理的兼容性)。這類構(gòu)建版的質(zhì)量預期也遠低于發(fā)行版。Beta 測試版本也屬于這一類別。
重要注意事項:通過 EAP 為 1.X(例如 1.1.0-eap-X)編譯的所有二進制文件會被編譯器發(fā)行版版本拒絕。我們不希望預發(fā)布版本編譯的任何代碼在穩(wěn)定版本發(fā)布后保留。這不涉及補丁版本的 EAP(例如 1.1.3-eap-X),這些 EAP 產(chǎn)生具有穩(wěn)定 ABI 的構(gòu)建。
當一個大團隊遷移到一個新版本時,當一些開發(fā)人員已經(jīng)更新、而其他人沒有時,可能會在某個時候出現(xiàn)“不一致的狀態(tài)”。為了防止前者編寫和提交別人可能無法編譯的代碼,我們提供了以下命令行開關(guān)(在 IDE 以及 Gradle/Maven 中也可用):
-language-version X.Y——Kotlin 語言版本 X.Y 的兼容性模式,對其后出現(xiàn)的所有語言功能報告錯誤-api-version X.Y——Kotlin API 版本 X.Y 的兼容性模式,對使用來自 Kotlin 標準庫(包括編譯器生成的代碼)的新版 API 的所有代碼報告錯誤。如果使用 NV Kotlin 編譯器并在 classpath 中配有 OV 標準庫或 OV 反射庫,那么可能是項目配置錯誤的跡象。
為了防止編譯期或運行時出現(xiàn)意外問題,我們建議要么將依賴關(guān)系更新到 NV,要么明確指定 API 版本/語言版本參數(shù)。
否則編譯器會檢測到某些東西可能出錯,并報告警告。
例如,如果 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.
這意味著你針對版本 1.0 的標準庫或反射庫使用 Kotlin 編譯器 1.1。這可以通過不同的方式處理:
-api-version 1.0。-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 反射庫。為了防止在運行時出現(xiàn)微妙的錯誤,我們建議你使用所有 Kotlin 庫的相同版本。在本例中,請考慮對 1.1 反射庫添加顯式依賴關(guān)系。
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
這意味著在 classpath 中有一個庫,它不是作為 Gradle/Maven 依賴項而依賴 Kotlin 標準庫,而是與它分布在同一個構(gòu)件中(即是被捆綁的)。這樣的庫可能會導致問題,因為標準構(gòu)建工具不認為它是 Kotlin 標準庫的實例,因此它不受依賴版本解析機制的限制,你可以在 classpath 找到同一個庫的多個版本。請考慮聯(lián)系這樣的庫的作者,并提出使用 Gradle/Maven 依賴取代的建議。