繁体   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