More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'
最近在引入兩個kotlin寫的aar庫時編譯器報了這樣的一個錯誤。說是打包時存在兩個相同的文件风题,文件路徑是META-INF/library_release.kotlin_module
判导。
這個文件是干什么用的呢?
這就要從 kotlin 的package-level-functions
說起了沛硅。
我們都知道 kotlin 支持文件級別的函數(shù)眼刃、變量申明,也就是說我們可以直接在一個文件中申明變量摇肌、方法擂红,而不像Java,必須有一個類來承接這些定義围小。
每個這種有了文件級別的申明的 kotlin source file昵骤,都會默認創(chuàng)建一個同樣命名,但首字母大寫肯适,末尾加了“Kt”后綴的class類变秦。
比如FileExt.kt
會編譯成FileExtKt.class
在Java代碼中,可以通過編譯后的類名訪問 kotlin 申明在頂層的函數(shù)和變量框舔。因此蹦玫,在同一包名下赎婚,不支持兩個命名相同的kotlin source文件。
但是樱溉,我們通過@file:JvmName("CustomName")
可以顯式的指定一個文件編譯后的類名挣输,或者通過@file:JvmMultifileClass
指定哪幾個文件共享一個類名。這就是通過注解告訴kotlin編譯器饺窿,我這個文件要編譯到哪個生成類中歧焦。
為了實現(xiàn)這個功能,kotlin專門引入了一個resource文件肚医,用來指導kotlin的編譯绢馍。
沒錯,這個文件就是 META-INF/<module_name>.kotlin_module
.
網(wǎng)上有很多人解決上面的問題時肠套,將 .kotlin_module
文件在打包流程中exclude舰涌,實際上這種做法是不正確的。
其實只需要保證module名字沒有沖突你稚,生成的.kotlin_module
文件自然也就不會沖突瓷耙。
在 gradle 工程中,這個文件的名字由當前工程的module
名字 + build variant
組成刁赖。
例如在一個 aar sdk 中搁痛,你可能會創(chuàng)建一個叫做 library
的module 文件夾,release
發(fā)布出去后宇弛,生成的aar中會帶有'META-INF/library_release.kotlin_module'
這個文件鸡典。
如果其他的工程也使用了相同的module name
,比如另外一個aar剛好也用了library
作為module名稱枪芒,就會報上面的錯誤彻况。
通過kotlinOptions可以指定moduleName
名稱。比如下面的這段代碼會將moduleName
修改為項目的group.artifact
名字舅踪。
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
compileOptions {
kotlinOptions.freeCompilerArgs += ['-module-name', "$PUBLISH_GROUP_ID.$PUBLISH_ARTIFACT_ID"]
}
defaultConfig {
minSdkVersion 8
targetSdkVersion 25
versionCode 1
versionName "1.0.5"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
注意:PUBLISH_GROUP_ID 和 PUBLISH_ARTIFACT_ID 是自定義的變量纽甘,你可以將它改為自己的項目中的具體值。
參考文章:
https://github.com/Takhion/android-extras-delegates/issues/1
https://blog.jetbrains.com/kotlin/2015/09/kotlin-m13-is-out/
http://kotlinlang.org/docs/reference/java-interop.html#package-level-functions