使用 Kotlin 1.0.0 版本(在 IntelliJ 15 中编译)。
println(myPojoInstance.foo)
当它尝试编译引用基于 Lombok 的 POJO 的代码(在 IntelliJ 或 Gradle 中)时,它会给出错误“无法访问 'foo':它在“MyPojo”中是 'private'。这是真的,它们都是私有的并且是我的对象有 @Value @Builder 用于 lombok 注释。
我尝试专门调用 getFoo(),但它显示“未解析的 getFoo 引用”。也许有一些技巧可以让 Kotlin 知道如何处理 lombok 注释?
一般来说,不,不是。这种行为的原因是 Lombok 是 javac 的注释处理器,但是当 kotlin 编译器运行时,它也使用 javac,但没有注释处理,因此这就是 kotlin 看不到尚未生成的声明的原因。
目前唯一的解决方法是定义严格的编译顺序:首先是 Java,然后是 kotlin。不幸的是,这种方法有很大的缺点:在这种情况下,您无法使用 Java 中的 Kotlin 代码。要解决这个问题,您可能需要多模块项目,这可能会导致很多痛苦
lombok 有一个 Kotlin 编译器插件。 它仍处于实验阶段,可以与 Gradle 或 Maven 一起使用。
它只支持一大堆注释,包括
@Getter
、@Setter
@NoArgsConstructor
、@RequiredArgsConstructor
和@AllArgsConstructor
@Data
@With
@Value
似乎按预期工作。不幸的是,他们不支持
@Builder
注释,但您可以请求添加到 YouTrack
有关更多信息,请参阅 kotlin 文档中的 Lombok 编译器插件。
上面提到的
@Builder
注释票已修复!修复的目标版本是1.8.0-Beta
。
为了添加 Sergey Mashkov 的回复(在这里添加,我没有足够的代表点来评论它),这里有一个 Gradle 多项目设置的示例应用程序,其中 Kotlin 可以看到 Lombok 生成的代码(没有 kapt 或delomboking 确实适用 - 即,Kotlin 可以调用 Java 代码,但 Java 无法调用该特定模块中的 Kotlin 代码(因为这会创建循环依赖项),如果您有现有的,这种构建可能是合适的。不过,Java 代码库和所有新代码都是用 Kotlin 编写的。
不过,我希望看到完整的 Lombok/Kotlin 支持。虽然 Kotlin 与 Java 完全互操作,但现实情况是 Lombok 的使用非常广泛,这个问题可能会阻止大量想要转向 Kotlin 的开发人员这样做。
正如上面评论中提到的,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>
如果您根据 site 使用 delombok 并在 pom.xml 中的 build > plugins > plugin > kotlin-maven-plugin 下添加 target/ generated-sources/delombok 文件夹,那么看起来它可以工作