【问题标题】:Kotlin doesn't see Java Lombok accessors?Kotlin 没有看到 Java Lombok 访问器?
【发布时间】:2016-06-01 17:39:25
【问题描述】:

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

println(myPojoInstance.foo)

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

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

【问题讨论】:

  • 正如@voddan 指出的那样,您没有提供足够的信息来说明您尝试使用什么来解决此问题。另外,如果您尝试过 Kapt,它是在一个模块中还是在多个模块中。
  • 在提到“kapt”之前,我不知道有什么办法可以尝试解决它。我反复阅读 JetBrains 页面“java-interop”,但找不到任何暗示如何处理它的信息。 IntelliJ 不会在编辑器中将其标记为错误,但是在 IntelliJ 和 Gradle 中编译(通过 JetBrains kotlin gradle 插件)都不起作用。
  • 您是否设法解决了kapt 的问题?我很想知道。

标签: kotlin lombok println


【解决方案1】:

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

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

【讨论】:

  • 好吧,该死的。是的,我在我的程序中间使用了一大块 Java,并专门将它迁移到 Kotlin,以查看 Java->Kotlin->Java 支持将如何工作。目标是随着时间的推移迁移代码。但是,我们在所有域 POJO 中大量使用 Lombok。也许我可以在 compileJava 之前破解一个“compilePOJOs”目标来运行。
  • Sergey,是否有 JetBrains 链接/常见问题解答关于 Kotlin 如何查看位于同一位置的 Java 代码(相同模块)? Gradle 会在 compileJava 之前编译 Kotlin,但显然 Kotlin 知道 Java 代码(除了注解预处理)。 Kotlin 编译器会在编译 .kt 文件之前扫描 Java 代码吗?
  • 您并不孤单,我们有 Spring Roo 生成的 POJO,而 Kotlin 也没有看到它们,原因与 Sergey 所说的相同。
  • 这对我们来说也是一个真正的精彩。我们想在严重依赖 lombok 数据类和 Builder 的应用程序中引入 Kotlin。很容易将其视为“我对使用 lombok 说了什么......”,但事实仍然是这将阻止许多人研究使用 Kotlin。
  • @Billybong 使用 DeLombok:projectlombok.org/features/delombok.html 可以在源代码中包含 Lombok 生成的 Java 代码,然后您就可以从项目中删除 Lombok。
【解决方案2】:

要添加到 Sergey Mashkov 的回复(在此处添加,我没有足够的代表点来评论它),这是 Gradle 多项目设置的 example app,Kotlin 可以在其中看到 Lombok 生成的代码(没有 kapt或 delomboking。注意事项确实适用 - 即,Kotlin 可以调用 Java 代码,但 Java 不能在该特定模块中调用 Kotlin 代码(因为这会创建循环依赖)。如果您有不过,现有的 Java 代码库和所有新代码都是用 Kotlin 编写的。

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

【讨论】:

    【解决方案3】:

    正如上面 cmets 中提到的,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】:

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

      它只支持一个充满注释的手,包括

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

      它似乎按预期工作。不幸的是,它们不支持@Builder 注释,但您可以请求添加到YouTrack

      有关详细信息,请参阅 kotlin 文档中的 Lombok compiler plugin

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2022-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-15
          • 1970-01-01
          • 2011-05-13
          • 1970-01-01
          相关资源
          最近更新 更多