Kotlin项目编译遇权限拒绝错误,疑因文件名过长求解决方案
问题描述
构建克隆的WalletConnect Kotlin项目时出现编译错误:
error while writing /home/myuser/AndroidStudioProjects/WalletConnectKotlinV2/foundation/build/classes/kotlin/main/com/walletconnect/foundation/network/model/RelayDTO_Subscribe_Result_AcknowledgementJsonAdapter$annotationImpl$com_walletconnect_foundation_common_adapters_SubscriptionIdAdapter_Qualifier$0.class (Permission denied)
已执行ugo+w为相关文件设置权限,但错误依旧。查阅资料后推测是文件名过长导致,使用Android Studio 2021.3.1版本,项目的gradle配置及buildSrc常量/函数如下:
模块gradle配置
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("java-library") kotlin("jvm") id("com.google.devtools.ksp") version kspVersion id("publish-module-java") } project.apply { extra[KEY_PUBLISH_ARTIFACT_ID] = "foundation" extra[KEY_PUBLISH_VERSION] = "1.2.0-SNAPSHOT" extra[KEY_SDK_NAME] = "Foundation" } java { sourceCompatibility = jvmVersion targetCompatibility = jvmVersion } tasks.withType<KotlinCompile>() { kotlinOptions { jvmTarget = jvmVersion.toString() } } tasks.withType<Test>() { systemProperty("SDK_VERSION", requireNotNull(project.extra.get(KEY_PUBLISH_VERSION))) systemProperty("TEST_RELAY_URL", System.getenv("TEST_RELAY_URL")) systemProperty("TEST_PROJECT_ID", System.getenv("TEST_PROJECT_ID")) } dependencies { scarlet() okhttp() koinJvm() moshi() moshiKsp() bouncyCastle() multibaseJava() restEasyJava() jUnit5() mockk() }
buildSrc常量文件
import org.gradle.api.JavaVersion const val KEY_PUBLISH_VERSION = "PUBLISH_VERSION" const val KEY_PUBLISH_ARTIFACT_ID = "PUBLISH_ARTIFACT_ID" const val KEY_SDK_NAME = "SDK_NAME" const val dokkaVersion = "1.6.21" const val CORE_VERSION = "1.6.0" const val BOM_VERSION = "1.0.1" val jvmVersion = JavaVersion.VERSION_11 const val MIN_SDK: Int = 23 const val TARGET_SDK: Int = 32 const val COMPILE_SDK: Int = TARGET_SDK const val kotlinVersion = "1.7.10" const val kspVersion = "1.7.10-1.0.6" const val sqlDelightVersion = "1.5.2" const val moshiVersion = "1.13.0" const val coroutinesVersion = "1.6.4" const val scarletVersion = "1.0.0" const val scarletPackage = "com.github.WalletConnect.Scarlet" const val koinVersion = "3.2.0" const val mlKitBarcode = "16.0.1" const val camera2Version = "1.1.0-alpha01" const val lifecycleVersion = "2.5.1" const val lifecycleRuntimeKtx = "2.4.1" const val navVersion = "2.4.1" const val retrofitVersion = "2.9.0" const val okhttpVersion = "4.9.0" const val bouncyCastleVersion = "1.70" const val sqlCipherVersion = "4.5.0@aar" const val multibaseVersion = "1.1.0" const val jUnit5Version = "5.7.2" const val androidxTestVersion = "1.4.0" const val robolectricVersion = "4.6" const val mockkVersion = "1.12.0" const val jsonVersion = "20220320" const val timberVersion = "5.0.1" const val androidSecurityVersion = "1.1.0-alpha03" const val web3jVersion = "4.9.4" const val restEasyVersion = "3.15.3.Final"
buildSrc函数文件
import org.gradle.kotlin.dsl.DependencyHandlerScope fun DependencyHandlerScope.scanner() { "implementation"("com.google.mlkit:barcode-scanning:$mlKitBarcode") "implementation"("androidx.camera:camera-camera2:$camera2Version") "implementation"("androidx.camera:camera-lifecycle:$camera2Version") "implementation"("androidx.camera:camera-view:1.0.0-alpha21") } fun DependencyHandlerScope.lifecycle() { "implementation"("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion") "implementation"("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion") "implementation"("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleRuntimeKtx") } fun DependencyHandlerScope.navigationComponent() { "api"("androidx.navigation:navigation-fragment-ktx:$navVersion") "api"("androidx.navigation:navigation-ui-ktx:$navVersion") } fun DependencyHandlerScope.coroutines() { "api"("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion") } fun DependencyHandlerScope.coroutinesTest() { "testImplementation"("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion") } fun DependencyHandlerScope.scarlet() { "api"("$scarletPackage:scarlet:$scarletVersion") "api"("$scarletPackage:websocket-okhttp:$scarletVersion") "api"("$scarletPackage:stream-adapter-coroutines:$scarletVersion") "api"("$scarletPackage:message-adapter-moshi:$scarletVersion") } fun DependencyHandlerScope.scarletAndroid() { "api"("$scarletPackage:lifecycle-android:$scarletVersion") } fun DependencyHandlerScope.scarletTest() { "testImplementation"("$scarletPackage:websocket-mockwebserver:$scarletVersion") "testImplementation"("$scarletPackage:test-utils:$scarletVersion") } fun DependencyHandlerScope.retrofit() { "api"("com.squareup.retrofit2:retrofit:$retrofitVersion") "api"("com.squareup.retrofit2:converter-moshi:$retrofitVersion") } fun DependencyHandlerScope.moshi() { "api"("com.squareup.moshi:moshi-adapters:$moshiVersion") "api"("com.squareup.moshi:moshi-kotlin:$moshiVersion") } fun DependencyHandlerScope.moshiKsp() { "ksp"("com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion") } fun DependencyHandlerScope.okhttp() { "api"(platform("com.squareup.okhttp3:okhttp-bom:$okhttpVersion")) "api"("com.squareup.okhttp3:okhttp") "api"("com.squareup.okhttp3:logging-interceptor") } fun DependencyHandlerScope.bouncyCastle() { "api"("org.bouncycastle:bcprov-jdk15on:$bouncyCastleVersion") } fun DependencyHandlerScope.sqlDelightAndroid() { "api"("com.squareup.sqldelight:android-driver:$sqlDelightVersion") "api"("com.squareup.sqldelight:coroutines-extensions-jvm:$sqlDelightVersion") } fun DependencyHandlerScope.sqlCipher() { "api"("net.zetetic:android-database-sqlcipher:$sqlCipherVersion") } fun DependencyHandlerScope.sqlDelightTest() { "testImplementation"("com.squareup.sqldelight:sqlite-driver:$sqlDelightVersion") "testImplementation"("org.xerial:sqlite-jdbc:3.8.10.2") { // 覆盖sqlite版本以匹配Android API 23 version { strictly("3.8.10.2") } } } fun DependencyHandlerScope.koinJvm() { "implementation"("io.insert-koin:koin-core:$koinVersion") } fun DependencyHandlerScope.koinAndroid() { "api"("io.insert-koin:koin-android:$koinVersion") } fun DependencyHandlerScope.koinTest() { "testImplementation"("io.insert-koin:koin-test-junit5:$koinVersion") } fun DependencyHandlerScope.glide_N_kapt() { "implementation"("com.github.bumptech.glide:glide:4.12.0") "kapt"("com.github.bumptech.glide:compiler:4.12.0") } fun DependencyHandlerScope.multibaseJava() { "api"("com.github.multiformats:java-multibase:$multibaseVersion") // 该库存在漏洞 } fun DependencyHandlerScope.restEasyJava() { "implementation"("org.jboss.resteasy:resteasy-jaxrs:$restEasyVersion") } fun DependencyHandlerScope.jUnit5() { "testImplementation"(platform("org.junit:junit-bom:$jUnit5Version")) "testImplementation"("org.junit.jupiter:junit-jupiter-api:$jUnit5Version") "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:$jUnit5Version") "testImplementation"("org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVersion") } fun DependencyHandlerScope.jUnit5Android() { "androidTestImplementation"("org.junit.jupiter:junit-jupiter-api:$jUnit5Version") "androidTestImplementation"("de.mannodermaus.junit5:android-test-core:1.3.0") "androidTestRuntimeOnly"("de.mannodermaus.junit5:android-test-runner:1.3.0") } fun DependencyHandlerScope.androidXTest() { "testImplementation"("androidx.test.ext:junit-ktx:1.1.3") "testImplementation"("androidx.test:core-ktx:$androidxTestVersion") "androidTestImplementation"("androidx.test:core-ktx:$androidxTestVersion") "androidTestImplementation"("androidx.test:runner:$androidxTestVersion") "androidTestImplementation"("androidx.test:rules:$androidxTestVersion") } fun DependencyHandlerScope.robolectric() { "testImplementation"("org.robolectric:robolectric:$robolectricVersion") } fun DependencyHandlerScope.mockk() { "testImplementation"("io.mockk:mockk:$mockkVersion") } fun DependencyHandlerScope.testJson() { "testImplementation"("org.json:json:$jsonVersion") } fun DependencyHandlerScope.timber() { "api"("com.jakewharton.timber:timber:$timberVersion") } fun DependencyHandlerScope.security() { "api"("androidx.security:security-crypto-ktx:$androidSecurityVersion") } fun DependencyHandlerScope.web3jCrypto() { "api"("org.web3j:crypto:$web3jVersion") }
解决方案
针对文件名过长导致的编译权限错误,可尝试以下几种方法:
- 缩短项目路径:将项目从当前长路径移动到更短的目录,比如
/home/myuser/wc-kotlin/,直接减少整体路径长度,避免文件名+路径超出系统限制。 - 配置Gradle使用短路径构建目录:在项目根目录的
gradle.properties文件中添加以下配置,让Gradle使用更短的构建输出路径:
注意:使用全局临时目录需确保当前用户有读写权限。# 自定义项目内短路径作为构建目录 project.buildDir=.b # 或指定全局临时目录 org.gradle.project.buildDir=/tmp/wc-build - 调整Moshi-KSP代码生成命名策略:错误中的长文件名来自Moshi-KSP生成的JsonAdapter类,可在模块
build.gradle.kts中添加KSP配置缩短类名:
也可以针对特定DTO类手动编写JsonAdapter,避免KSP生成过长类名。ksp { arg("moshi.generated.class.name", "Short${name}JsonAdapter") } - 启用Linux长文件名支持:如果是Linux系统,编辑
/etc/fstab在对应分区挂载选项中添加nobarrier,errors=remount-ro,utf8,names=long,然后执行sudo mount -o remount /重新挂载分区(需管理员权限,不同文件系统参数略有差异)。
内容的提问来源于stack exchange,提问作者Luis Masuelli
相关产品推荐
相关产品推荐

