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