You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置缩短类名:
    ksp {
        arg("moshi.generated.class.name", "Short${name}JsonAdapter")
    }
    
    也可以针对特定DTO类手动编写JsonAdapter,避免KSP生成过长类名。
  • 启用Linux长文件名支持:如果是Linux系统,编辑/etc/fstab在对应分区挂载选项中添加nobarrier,errors=remount-ro,utf8,names=long,然后执行sudo mount -o remount /重新挂载分区(需管理员权限,不同文件系统参数略有差异)。

内容的提问来源于stack exchange,提问作者Luis Masuelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:35:19