Kotlin 看不到 Java Lombok 访问器?

问题描述 投票:0回答:5

使用 Kotlin 1.0.0 版本(在 IntelliJ 15 中编译)。

println(myPojoInstance.foo)

当它尝试编译引用基于 Lombok 的 POJO 的代码(在 IntelliJ 或 Gradle 中)时,它会给出错误“无法访问 'foo':它在“MyPojo”中是 'private'。这是真的,它们都是私有的并且是我的对象有 @Value @Builder 用于 lombok 注释。

我尝试专门调用 getFoo(),但它显示“未解析的 getFoo 引用”。也许有一些技巧可以让 Kotlin 知道如何处理 lombok 注释?

kotlin lombok println
5个回答
95
投票

一般来说,不,不是。这种行为的原因是 Lombok 是 javac 的注释处理器,但是当 kotlin 编译器运行时,它也使用 javac,但没有注释处理,因此这就是 kotlin 看不到尚未生成的声明的原因。

目前唯一的解决方法是定义严格的编译顺序:首先是 Java,然后是 kotlin。不幸的是,这种方法有很大的缺点:在这种情况下,您无法使用 Java 中的 Kotlin 代码。要解决这个问题,您可能需要多模块项目,这可能会导致很多痛苦


23
投票

lombok 有一个 Kotlin 编译器插件。 它仍处于实验阶段,可以与 GradleMaven 一起使用。

它只支持一大堆注释,包括

  • @Getter
    @Setter
  • @NoArgsConstructor
    @RequiredArgsConstructor
    @AllArgsConstructor
  • @Data
  • @With
  • @Value

似乎按预期工作。不幸的是,他们不支持

@Builder
注释,但您可以请求添加到 YouTrack

有关更多信息,请参阅 kotlin 文档中的 Lombok 编译器插件

更新1

上面提到的

@Builder
注释票已修复!修复的目标版本是
1.8.0-Beta


6
投票

为了添加 Sergey Mashkov 的回复(在这里添加,我没有足够的代表点来评论它),这里有一个 Gradle 多项目设置的示例应用程序,其中 Kotlin 可以看到 Lombok 生成的代码(没有 kapt 或delomboking 确实适用 - 即,Kotlin 可以调用 Java 代码,但 Java 无法调用该特定模块中的 Kotlin 代码(因为这会创建循环依赖项),如果您有现有的,这种构建可能是合适的。不过,Java 代码库和所有新代码都是用 Kotlin 编写的。

不过,我希望看到完整的 Lombok/Kotlin 支持。虽然 Kotlin 与 Java 完全互操作,但现实情况是 Lombok 的使用非常广泛,这个问题可能会阻止大量想要转向 Kotlin 的开发人员这样做。


6
投票

正如上面评论中提到的,delombok 有帮助。 如果是 Maven 构建,则为:

<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>${lombok.version}.0</version>
    <executions>
        <execution>
            <id>delombok</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
            <configuration>
                <formatPreferences>
                    <javaLangAsFQN>skip</javaLangAsFQN>
                </formatPreferences>
                <verbose>true</verbose>
            </configuration>
        </execution>
        <execution>
            <id>test-delombok</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>testDelombok</goal>
            </goals>
            <configuration>
                <verbose>true</verbose>
            </configuration>
        </execution>
    </executions>
</plugin>

4
投票

如果您根据 site 使用 delombok 并在 pom.xml 中的 build > plugins > plugin > kotlin-maven-plugin 下添加 target/ generated-sources/delombok 文件夹,那么看起来它可以工作

© www.soinside.com 2019 - 2024. All rights reserved.