Не удается найти kotlin-mirror.jar при вызове Kotlin из Java-программы - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать библиотеку генерации Typescript, которая называется ts-generator.Он живет на https://github.com/ntrrgc/ts-generator. Это выглядит довольно круто.

Моя проблема в том, что при попытке использовать библиотеку, я получаю

kotlin.jvm.KotlinReflectionNotSupportedError

В сообщении об ошибке также говорится, что яСкорее всего, мне не хватает kotlin-рефлекса. 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()
        );
    }
}

Вывод при запуске задачи выглядит следующим образом.Первый бит - это дамп classpath, в списке которого есть kotlin-refle-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 (как вы можете себе представить) не имеют никакого значения для результата.

1 Ответ

0 голосов
/ 24 мая 2018

См. Документация Kotlin .

На платформе Java компонент времени выполнения, необходимый для использования функций отражения, распространяется в виде отдельного файла JAR (kotlin-refle.jar),Это сделано для уменьшения необходимого размера библиотеки времени выполнения для приложений, которые не используют функции отражения. Если вы используете отражение, убедитесь, что файл .jar добавлен в путь к классам вашего проекта.

Или вы можете добавить его в свои зависимости.Подробнее здесь .

compile "org.jetbrains.kotlin:kotlin-reflect"
testCompile "org.jetbrains.kotlin:kotlin-test"
testCompile "org.jetbrains.kotlin:kotlin-test-junit"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...