Использование пути к классам среды выполнения модуля Android в задаче JavaExec gradle

У меня есть Android-модуль, который содержит задачу Gradle JavaExec. При запуске задачи JavaExec я хотел бы, чтобы она использовала путь к классам модуля. Задача JavaExec выполняет основную функцию Kotlin, которая использует стороннюю библиотеку (kotlinpoet). Но при запуске задачи Gradle я получаю java.lang.ClassNotFoundException из-за того, что библиотека kotlinpoet не включена в путь к классам.

Я нашел похожие проблемы в StackOverflow и пробовал много вариантов для classpath параметр в myTask, но ничего из этого не сработало.

Вот build.gradle файл:

      plugins {
    id 'com.android.library'
    id 'kotlin-android'
}

apply plugin: 'kotlinx-serialization'

android {
    compileSdkVersion 30    
    defaultConfig {
    ...
    }
    buildTypes {
    ...
    }
    compileOptions {
    ...
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

task myTask(type: JavaExec) {
    classpath += (files('build/tmp/kotlin-classes/debug', "${android.sdkDirectory}/tools/lib/kotlin-stdlib-1.1.3-2.jar", getBuildDir().toString() + "/intermediates/classes/debug"))
    main = 'com.foo.app.home.parser.MainKt'
}

tasks.named('build') { dependsOn('configGeneratorTask') }

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "androidx.core:core-ktx:$androidx_core_ktx"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-core:$kotlinx_serialization_version"
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
    implementation 'com.squareup:kotlinpoet:1.10.2'
}

1 ответ

Вы можете получить путь к классам из каждого варианта. Это должно помочь:

      afterEvaluate { // needed to make sure all android setup is available
    task myTask(type: JavaExec) {
        // you probably don't even need to set all these paths manually anymore
        classpath += files(
                'build/tmp/kotlin-classes/debug',
                "${android.sdkDirectory}/tools/lib/kotlin-stdlib-1.1.3-2.jar",
                getBuildDir().toString() + "/intermediates/classes/debug"
        )

        android.applicationVariants.each { variant -> // or libraryVariants
            // add each variant's compiler classpath onto this classpath
            classpath += variant.javaCompileProvider.get().classpath
        }
        // uncomment the line below if you need the android.jar etc
        // classpath += files(android.bootClasspath) 

        // setting main directly is now deprecated. Set it like this:
        mainClass.set('com.foo.app.home.parser.MainKt') 
    }
}

Также см. этот ответ здесь: /questions/35661899/android-gradle-runtimeclasspath-ekvivalent/35661901#35661901

Другие вопросы по тегам