Kotlin 没有看到 Java Lombok 访问器?
Kotlin doesn't see Java Lombok accessors?
使用 Kotlin 1.0.0 版本(在 IntelliJ 15 中编译)。
println(myPojoInstance.foo)
当它尝试编译引用基于 Lombok 的 POJO 的代码(在 IntelliJ 或 Gradle 中)时,它会给出错误 "Cannot access 'foo': it is 'private' in "MyPojo”。这是真的,它们都是私有的,并且是我的对象具有用于 lombok 注释的 @Value @Builder。
我试过专门调用 getFoo(),但它显示 "unresolved reference for getFoo"。也许有一些技巧可以让 Kotlin 知道如何处理 lombok 注释?
一般来说,不会。这种行为的原因是 Lombok 是 javac 的注解处理器,但是当 kotlin 编译器运行时它也使用 javac 但没有注解处理,所以这就是为什么 kotlin 看不到尚未生成的声明。
目前唯一的解决方法是定义严格的编译顺序:Java 首先,然后是 kotlin。不幸的是,这种方法有很大的缺点:在这种情况下,您不能使用来自 Java 的 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>
添加到 Sergey Mashkov 的回复中(在这里添加我没有足够的代表点数来评论它),这是 Kotlin 可以看到的 Gradle 多项目设置的 example app Lombok 生成的代码(没有 kapt 或 delmboking。注意事项适用 - 即,Kotlin 可以调用 Java 代码,但 Java 不能调用该特定模块中的 Kotlin 代码(因为这会创建循环依赖)。如果你有一个现有的 Java 代码库并且所有新代码都是用 Kotlin 编写的,那么这种构建可能是合适的。
不过,我希望看到完整的 Lombok/Kotlin 支持。虽然 Kotlin 与 Java 完全互操作,但现实是 Lombok 的使用非常广泛,这个问题可能会阻止大量想要切换到 Kotlin 的开发人员这样做。
如果您根据 site 使用 delombok 并在 pom.xml 下的 build > plugins > plugin > kotlin-maven-plugin
有一个用于 lombok 的 Kotlin 编译器插件。 它仍然是实验性的,它可以与 Gradle 或 Maven 一起使用。
只支持一手全注解包括
@Getter
、@Setter
@NoArgsConstructor
、@RequiredArgsConstructor
和 @AllArgsConstructor
@Data
@With
@Value
它似乎按预期工作。不幸的是,他们不支持 @Builder
注释,但您可以请求在 YouTrack
中添加
有关详细信息,请参阅 kotlin 文档中的 Lombok compiler plugin。
使用 Kotlin 1.0.0 版本(在 IntelliJ 15 中编译)。
println(myPojoInstance.foo)
当它尝试编译引用基于 Lombok 的 POJO 的代码(在 IntelliJ 或 Gradle 中)时,它会给出错误 "Cannot access 'foo': it is 'private' in "MyPojo”。这是真的,它们都是私有的,并且是我的对象具有用于 lombok 注释的 @Value @Builder。
我试过专门调用 getFoo(),但它显示 "unresolved reference for getFoo"。也许有一些技巧可以让 Kotlin 知道如何处理 lombok 注释?
一般来说,不会。这种行为的原因是 Lombok 是 javac 的注解处理器,但是当 kotlin 编译器运行时它也使用 javac 但没有注解处理,所以这就是为什么 kotlin 看不到尚未生成的声明。
目前唯一的解决方法是定义严格的编译顺序:Java 首先,然后是 kotlin。不幸的是,这种方法有很大的缺点:在这种情况下,您不能使用来自 Java 的 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>
添加到 Sergey Mashkov 的回复中(在这里添加我没有足够的代表点数来评论它),这是 Kotlin 可以看到的 Gradle 多项目设置的 example app Lombok 生成的代码(没有 kapt 或 delmboking。注意事项适用 - 即,Kotlin 可以调用 Java 代码,但 Java 不能调用该特定模块中的 Kotlin 代码(因为这会创建循环依赖)。如果你有一个现有的 Java 代码库并且所有新代码都是用 Kotlin 编写的,那么这种构建可能是合适的。
不过,我希望看到完整的 Lombok/Kotlin 支持。虽然 Kotlin 与 Java 完全互操作,但现实是 Lombok 的使用非常广泛,这个问题可能会阻止大量想要切换到 Kotlin 的开发人员这样做。
如果您根据 site 使用 delombok 并在 pom.xml 下的 build > plugins > plugin > kotlin-maven-plugin
有一个用于 lombok 的 Kotlin 编译器插件。 它仍然是实验性的,它可以与 Gradle 或 Maven 一起使用。
只支持一手全注解包括
@Getter
、@Setter
@NoArgsConstructor
、@RequiredArgsConstructor
和@AllArgsConstructor
@Data
@With
@Value
它似乎按预期工作。不幸的是,他们不支持 @Builder
注释,但您可以请求在 YouTrack
有关详细信息,请参阅 kotlin 文档中的 Lombok compiler plugin。