【问题标题】:Cannot find kotlin-reflection.jar when calling Kotlin from a Java program从 Java 程序调用 Kotlin 时找不到 kotlin-reflection.jar
【发布时间】:2018-05-24 06:44:29
【问题描述】:

我正在尝试使用一个名为 ts-generator 的 Typescript 生成库。它位于https://github.com/ntrrgc/ts-generator。看起来很酷。

我的问题是当尝试使用该库时,我得到一个

kotlin.jvm.KotlinReflectionNotSupportedError

错误消息还说我可能缺少 kotlin-reflect.jar

但是,该 jar 似乎确实在我的类路径中。我制作了一个 SSCE,我认为它可以证明我的问题,如下所示。

我的 gradle 文件是

jar {
    baseName = 'eiep_codegen'
    version = '1' 
}
repositories {
     maven { url 'https://jitpack.io' }
}
dependencies {
    compile 'com.github.ntrrgc:ts-generator:1.1.0' 
}
task execute(type:JavaExec) {
   main = mainClass
   classpath = sourceSets.main.runtimeClasspath
}

我要运行的代码是

package testing;

import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import kotlin.jvm.internal.ClassReference;
import kotlin.reflect.KClass;
import me.ntrrgc.tsGenerator.TypeScriptGenerator;
import me.ntrrgc.tsGenerator.VoidType;

public class GenerateTSClasses 
{
    public static void main(String []args)
    {
        ClassLoader cl = ClassLoader.getSystemClassLoader();

        URL[] urls = ((URLClassLoader)cl).getURLs();

        for(URL url: urls){
            System.out.println(url.getFile());
        }

        List<KClass<?>> roots = new ArrayList<>();
        Map<KClass<?>, String> mappings = new HashMap<>();

        roots.add(new ClassReference(GenerateMe.class));

        System.out.println
        (
            new TypeScriptGenerator
            (
                    roots,
                    mappings,
                    new ArrayList<>(),
                    new HashSet<>(),
                    "Hey There", 
                    VoidType.NULL
            ).getDefinitionsText()
        );
    }
}

我运行任务时的输出如下。第一位是类路径的转储,列表中有 kotlin-reflect-1.2.10.jar。第二部分是例外。

/Users/joe/git/4.x/ei-sources/eiep_codegen/build/classes/java/main/
/Users/joe/git/4.x/ei-sources/eiep_codegen/build/resources/main
/Users/joe/.gradle/caches/modules-2/files-2.1/com.github.ntrrgc/ts-generator/1.1.0/3c9db2d2350dae022e3d4c8e77589a3e7f50db2b/ts-generator-1.1.0.jar
/Users/joe/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.10/19bc012f8c4cd6b705bd6512263777cc19bcf259/kotlin-reflect-1.2.10.jar
/Users/joe/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.10/b9bf650516989595a5390e5a54181e16347208ac/kotlin-stdlib-1.2.10.jar
/Users/joe/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar
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.ClassReference.error(ClassReference.kt:86)
...

我的问题是 - 有谁知道是什么导致了这个问题? (我假设它不能是 jar 文件后面的版本号,但我也会验证)。

编辑 - 我还手动处理了 jar 文件,并使用 java --classpath 从命令行运行程序。 jar 文件的名称(如您所想)对结果没有影响。

【问题讨论】:

    标签: java gradle kotlin


    【解决方案1】:

    Kotlin docuementation

    在 Java 平台上,使用反射功能所需的运行时组件作为单独的 JAR 文件 (kotlin-reflect.jar) 分发。这样做是为了减少不使用反射功能的应用程序所需的运行时库大小。 如果您确实使用反射,请确保将 .jar 文件添加到项目的类路径中。

    或者您可以选择将其添加到您的依赖项中。阅读更多here

    compile "org.jetbrains.kotlin:kotlin-reflect"
    testCompile "org.jetbrains.kotlin:kotlin-test"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit"
    

    【讨论】:

    • 与 /Users/joe/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.2.10/19bc012f8c4cd6b705bd6512263777cc19bcf259/kotlin-reflect 不同吗? -1.2.10.jar?
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2018-11-19
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多