Как исправить библиотеки Kotlin, не разрешенные в IntelliJ в коде Kotlin (в проекте Java)? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть два проекта.Один полностью написан на Kotlin, который экспортирует артефакт Клиента.Я пытаюсь использовать клиента во втором проекте, который имеет смесь кода Java / Kotlin.

В классах Java у меня нет проблем с импортом файлов kotlin для использования, но в любых файлах kotlin IntelliJ не может разрешить импорт.Весь другой код kotlin работает нормально, и я могу без проблем скомпилировать его из командной строки через maven.Это просто проблема с IntelliJ, не распознающим пакет, который я ищу.

Я вижу пакет как на моей панели инструментов maven, так и во внешних библиотеках, перечисленных в проекте.Я проверил фляги и, конечно же, файл, который я ожидаю com/foo/bar/BazClient.class, присутствует, но import com.foo.bar.BazClient говорит мне, что пакет bar (код из другого проекта) не существует.Тот же оператор импорта прекрасно работает в Java-коде.

Дальнейшее добавление к моим задачам точно такого же Java-класса, который импортирует этот клиент, если я конвертирую в kotlin, используя встроенный метод IJ, не компилируется в IntelliJ.Действие «построить проект» успешно завершено без предупреждений / ошибок.

Клиент Kotlin определен как:

package com.foo.bar

import retrofit2.http.GET

interface BazClient {
    @GET("/v1/fuzz")
    fun getFuzz(): Call<FuzzResponse>
}

Рабочий код Java:

package com.whodat.wat;

import javax.inject.Singleton;
import com.foo.bar.BazClient;

@Singleton
public class CallTheService {
    private final BazClient bazClient;

    public CallTheService(BazClient bazClient) {
        this.bazClient = bazClient;
    }

    public FuzzResponse callIt() throws IOException {
        return bazClient.getFuzz().execute().body();
    }
}

Недействительный код Kotlin:

package com.whodat.wat

import javax.inject.Singleton
import com.foo.bar.BazClient // "bar" is red in editor

@Singleton
// Can't resolve "BazClient" here 
class CallTheService(private val bazClient: BazClient) {

    fun callIt(): FuzzResponse {
        return bazClient.getFuzz().execute().body()!!
    }
}

1 Ответ

0 голосов
/ 02 апреля 2019

Оказывается, это была проблема при публикации клиентского артефакта. Мы использовали плагины maven shade и jar для создания банок, и это привело ко многим kotlin_modules в банке, которые приводили в замешательство IJ

META-INF/client.kotlin_module
META-INF/descriptors.jvm.kotlin_module
META-INF/descriptors.kotlin_module
META-INF/descriptors.runtime.kotlin_module
META-INF/deserialization.kotlin_module
META-INF/kotlin-reflect-api.kotlin_module
META-INF/metadata.jvm.kotlin_module
META-INF/metadata.kotlin_module
META-INF/util.runtime.kotlin_module
META-INF/kotlin-stdlib.kotlin_module
META-INF/kotlin-stdlib_coroutinesExperimental.kotlin_module
META-INF/kotlin-stdlib-common.kotlin_module
META-INF/kotlin-stdlib-common-coroutines.kotlin_module
META-INF/kotlin-stdlib-jdk8.kotlin_module
META-INF/kotlin-stdlib-jdk7.kotlin_module

Удаление этих из сборки клиента, кажется, прояснило ситуацию, и теперь у нас есть только один client.kotlin_module.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...