Kotlin 没有看到 Java Lombok 访问器?
Posted
技术标签:
【中文标题】Kotlin 没有看到 Java Lombok 访问器?【英文标题】:Kotlin doesn't see Java Lombok accessors? 【发布时间】: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 注释?
【问题讨论】:
你用过kapt
吗? blog.jetbrains.com/kotlin/2015/06/…
正如@voddan 指出的那样,您没有提供足够的信息来说明您尝试使用什么来解决此问题。另外,如果您尝试过 Kapt,它是在一个模块中还是在多个模块中。
在提到“kapt”之前,我不知道有什么办法可以尝试解决它。我反复阅读 JetBrains 页面“java-interop”,但找不到任何暗示如何处理它的信息。 IntelliJ 不会在编辑器中将其标记为错误,但是在 IntelliJ 和 Gradle 中编译(通过 JetBrains kotlin gradle 插件)都不起作用。
您是否设法解决了kapt
的问题?我很想知道。
【参考方案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 编译器插件。 仍处于试验阶段,可与 Gradle 或 Maven 一起使用。
它只支持一个充满注释的手,包括
@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 文件夹,看起来它可以工作
【讨论】:
以上是关于Kotlin 没有看到 Java Lombok 访问器?的主要内容,如果未能解决你的问题,请参考以下文章