Idea intellij: la implementación de reflexión de Kotlin no se encuentra en tiempo de ejecución. Asegúrate de tener kotlin-reflec

CorePress2024-01-25  9

Estoy aprendiendo Kotlin y tengo un problema con este código:

import kotlin.reflect.*

fun main(args: Array<String>) {
    val lst = listOf(1,2,3,45,5,6,7,8)
    val mapped = lst.map {Data(::isEven,it)}
    for(item in mapped){
        var result = item.func.call(item.param)
        println("$result ${item.func} ${item.param}")
    }

}

fun isEven(number: Int):Boolean{
    return number%2==0;
}

class Data(val func: KFunction<Any>,val param:Any)

Mi build.gradle se ve así:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.31'
    id 'application'
}

group = 'me.janva'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.4.31'
    testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
}

test {
    useJUnit()
}

compileKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

compileTestKotlin {
    kotlinOptions.jvmTarget = '1.8'
}

application {
    mainClassName = 'MainKt'
}

Intenté buscarlo en Google, pero solo encontré soluciones con "implementación" dependencia que no me funciona. ¿Cómo puedo hacer que este programa se ejecute?

Ahora, si compilo este código en IntelliJ, se ejecuta cuando falla con esto:

C:\Users\janva\OpenJdks\jdk-15.0.2\bin\java.exe -javaagent:C:\Users\janva\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-03.7717.56\lib\idea_rt.jar=52396:C:\Users\janva\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-03.7717.56\bin -Dfile.encoding=UTF-8 -classpath E:\projects\ReflectionTest\build\classes\kotlin\main;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk8.4.31\e613be5465ef1e6fd0468707690b7ebf625ea2fe\kotlin-stdlib-jdk8-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-jdk7.4.31ce8e85f6e84270b2b501d44e9f0ba6ff64fa71\kotlin-stdlib-jdk7-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib.4.31\a58e0fb9812a6a93ca24b5da75e4b5a0cb89c957\kotlin-stdlib-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains.kotlin\kotlin-stdlib-common.4.31dd50665802f54ba9bc3f70ecb20227d1bc81323\kotlin-stdlib-common-1.4.31.jar;C:\Users\janva\.gradle\caches\modules-2\files-2.1\org.jetbrains\annotations.09f0dfe192fb4e063e7dacadee7f8bb9a2672a9\annotations-13.0.jar MainKt
Exception in thread "main" kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath
    at kotlin.jvm.internal.CallableReference.getReflected(CallableReference.java:98)
    at kotlin.jvm.internal.FunctionReference.getReflected(FunctionReference.java:63)
    at kotlin.jvm.internal.FunctionReference.getReflected(FunctionReference.java:12)
    at kotlin.jvm.internal.CallableReference.call(CallableReference.java:161)
    at MainKt.main(main.kt:8)

Process finished with exit code 1

1

kotlin-reflect no está en tu classpath. Si va a ejecutarlo de esa manera, utilizando bibliotecas explícitas y archivos .class sueltos, deberá agregar it a su ruta de clase. Pero es más común crear un archivo .jar y ejecutarlo desde allí; Si creas un 'fat jar' o .war que incluye sus dependencias, no necesitarás especificar ninguna de ellas manualmente.

- gidds

28/03/2021 a las 11:18

Estaba pensando que se supone que Gradle y la parte de dependencia para esto. De todos modos tienes razón. Descargué jar, lo agregué a classpath y ahora está funcionando. Incluso si elimino el archivo jar y la declaración, permanezco en "build.gradle". Tal vez solo se trataba de un archivo "build.gradle" no sincronizado. archivo. Debo decir que esto es algo extraño para C#.programador :D

- Jan Válek

28/03/2021 a las 16:51



------------------------------------

El problema es que falta una dependencia en build.gradle.

Simplemente agregue lo siguiente para solucionarlo.

dependencies {
    ...
    implementation "org.jetbrains.kotlin:kotlin-reflect"
    ...
}



------------------------------------

De alguna manera empezó a funcionar. Lo que hice fue:

descargue kotlin-reflect.jar desde el repositorio de Maven siguiente en el archivo IntelliJ -> estructura del proyecto -> módulos -> las dependencias agregan la ruta al directorio con kotlin-reflect.jar - confirme Ok ahora estaba funcionando. elimine esta configuración, elimine el archivo descargado. editar "build.gradle" inserte la dependencia o realice el mismo cambio y haga clic en sincronizar.

El proyecto está funcionando y puedo ver esta biblioteca reflejada en bibliotecas externas como dependencia de Gradle.

Como mencioné en la pregunta, estoy comenzando con "Kotlin-jvm" Así que supongo que esta es una solución subóptima, pero a mí me funciona.

Respondido

28 de marzo de 2021 a las 17:02

Jan Válek

Jan Válek

434

4

4 insignias de plata

15

15 insignias de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare