Kotlin没有看到Java Lombok访问器?

时间:2016-02-20 00:03:40

标签: kotlin lombok println

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

println(myPojoInstance.foo)

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

我试过专门调用getFoo(),但它说“getFoo的未解析引用”。也许有一些技巧可以让Kotlin意识到如何处理lombok注释?

5 个答案:

答案 0 :(得分:43)

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

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

答案 1 :(得分:3)

要添加到Sergey Mashkov的回复(在这里添加我没有足够的重复点来评论它),这里是一个example app的Gradle多项目设置,其中Kotlin可以看到Lombok生成的代码(没有kapt或delomboking。警告确实适用 - 即,Kotlin可以调用Java代码,但Java不能在该特定模块中调用Kotlin代码(因为这将创建循环依赖)。这种构建可能适合你有一个现有的Java代码库,所有新代码都是用Kotlin编写的。

但我很乐意看到完整的Lombok / Kotlin支持。虽然Kotlin可以与Java完全互操作,但事实是Lombok被广泛使用,而这个问题可能会阻止大量想要切换到Kotlin的开发人员这样做。

答案 2 :(得分:2)

正如上面的评论中提到的,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>

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:0)

如果你根据site使用delombok并在build&gt;下的pom.xml中添加target / generated-sources / delombok文件夹,它看起来很有用。插件&gt;插件&gt; kotlin-maven-plugin