Kotlin没有看到Java Lombok访问器?

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

println(myPojoInstance.foo) 

当它试图编译引用基于Lombok的POJO的代码(在IntelliJ或Gradle中)时,它会给出错误“Can not access’foo’:它是’MyPojo’中的’private’。这是真的,它们都是私有的,有@Value @Builder的lombok注释。

我试着专门调用getFoo(),但它说“getFoo的未解决的参考”。 让Kotlin意识到如何处理lombok注释也许有一些窍门?

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

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

正如上面的评论中提到的,delombok有帮助。 在maven构建的情况下,将是:

  org.projectlombok lombok-maven-plugin ${lombok.version}.0   delombok generate-sources  delombok    skip  true    test-delombok generate-test-sources  testDelombok   true     

要添加到Sergey Mashkov的回应(在这里添加我没有足够的代表点来评论它),这里是一个Gradle多项目设置的示例应用程序 ,其中Kotlin可以看到Lombok生成的代码(没有kapt或delomboking。也就是说,Kotlin可以调用Java代码,但是Java不能调用该特定模块中的Kotlin代码(因为这会创建一个循环依赖)。如果你有一个现存的Java代码库,这种构建可能是合适的。尽管如此,所有新的代码都是用Kotlin编写的。

不过,我很乐意看到完整的Lombok / Kotlin支持。 虽然Kotlin与Java完全可以互操作,但实际上Lombok的使用非常广泛,这个问题可能会阻止大量的开发人员愿意切换到Kotlin。