可以使用Lombok和Kotlin吗?

45

我有一个使用Kotlin和Gradle搭建的项目。我添加了Lombok作为一个依赖项,并且也通过kapt进行了注册。

compileOnly("org.projectlombok:lombok:$lombokVersion")
kapt("org.projectlombok:lombok:$lombokVersion")
我想使用@Slf4j注解来自动生成日志记录器。它适用于Java类,但不适用于Kotlin类。
目前是否可以同时使用Kotlin和Lombok?如果我使用@Slf4j注解一个Kotlin类,并在其中使用log,则会出现“未解决的引用: log”的错误。
显然没有应用任何注解处理。

1
如果只是为了记录日志,您可能需要查看https://discuss.kotlinlang.org/t/best-practices-for-loggers/226/9 - Emanuel
这个回答解决了你的问题吗?Kotlin无法看到Java Lombok访问器? - knittl
8个回答

24

Lombok并不在您的源代码上运行,而是在AST上运行。无论如何,它是一个注解处理器,由Java编译器在编译时运行。Kotlin编译器不使用这些注解处理器。请参见答案https://dev59.com/MlsW5IYBdhLWcg3wAjOm#35530223直接从权威渠道获取信息。


11
如果您只想使用Lombok的@ Slf4j,那么我建议改用kotlin-logging:https://github.com/MicroUtils/kotlin-logging。它是slf4j的简单包装器,因此您可以使用以下方式替换类中的注释@Slf4j
// Place definition above class declaration to make field static
private val logger = KotlinLogging.logger {}
// ...

logger.debug { "A message only logged if debug is enabled. With $variable support." }

请问您能否给出Kotlin日志记录更好的原因? - taegyun kim
3
@taegyunkim 我不会说它比较好,只是在 Kotlin 中没有 Lombok,而 KotlinLogging 是一个很好的、简单的 Slf4j 包装器。 - YetAnotherMatt
哦,这是一个愚蠢的问题。谢谢。 - taegyun kim

10

4

1

1

1

对于记录日志,我能做的最好的事情 - 因为@Slf4j不起作用 - 就像创建抽象日志类一样:

package org.example

import org.slf4j.LoggerFactory
import org.slf4j.Logger

abstract class Log {
    val log: Logger = LoggerFactory.getLogger(this.javaClass)
}

以及使用方法:

package org.example

class MyClass { 
    companion object : Log() {}
    @Test
    fun someFun() {
        log.info("Logging info")
    }
}

@Michael,这不是每个实例的问题,因为伴生对象继承自Log,但我不喜欢的是,如果您实际上需要从另一个类继承,则无法使用此解决方案。 - Osman
1
@Osman 伴生对象语义的误解。我的错,感谢您的纠正。 - Michael

-1

我看不出来如果没有 lombok 团队的额外支持它该如何运作。 Lombok 基于注解处理,因此它在编译时运行并在您的源代码上运行,所以我猜它假定了 Java 的语法。


1
Lombok 不直接运行在你的源代码上;相反,它利用了 Java 编译器内置的编译时注解处理器支持。 - ruakh
如果我没记错的话,Lombok 的一些高级功能实际上需要访问 Java 源代码。 - hotkey
据我所知,Lombok在编译时运行。因此它可以访问您的源代码。它还使用一些技术来修改生成的AST。 - Alberto S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接