Использование пути к классам среды выполнения модуля 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