簡體   English   中英

如何修復在 Kotlin 代碼(在 Java 項目中)中的 IntelliJ 中未解析的 Kotlin 庫?

[英]How to fix Kotlin libraries not resolving in IntelliJ in Kotlin code (in a java project)?

我有兩個項目。 一個完全用 Kotlin 編寫的導出客戶端工件。 我正在嘗試在混合了 java/kotlin 代碼的第二個項目中使用客戶端。

在 java 類中,導入 kotlin 文件以供使用沒有問題,但在任何 kotlin 文件中,IntelliJ 都無法解析導入。 所有其他 kotlin 代碼都可以正常工作,我可以通過 maven 在命令行上進行編譯,沒有任何問題。 只是IntelliJ 無法識別我正在尋找的包的問題。

我在我的 Maven 工具欄中以及項目中列出的外部庫中都看到了該包。 我已經檢查了 jars 並且確實存在我期望的com/foo/bar/BazClient.class文件,但是import com.foo.bar.BazClient告訴我包bar (來自另一個項目的代碼)不存在. 相同的 import 語句在 java 代碼中工作得很好。

進一步增加我的問題,導入這個客戶端的完全相同的 java 類,如果我使用 IJ 的內置方法轉換為 kotlin,則無法在 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()!!
    }
}

事實證明,這是發布客戶端工件時的問題。 我們使用 maven shade 和 jar 插件來創建 jars 並導致 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。

這個問題在 Jetbrains 問題跟蹤器中有一張 工單還沒有解決,但支持說:

這是自 Kotlin 插件KT-25709的 1.2.50 版本以來的一個已知問題。 作為解決方法,請停止在依賴 jar 中捆綁 Kotlin 運行時(即應從 jar 中刪除包 kotlin 下的所有內容)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM