Kotlin没有看到Java Lombok访问器?

问题描述:

使用Kotlin 1.0.0版本(在IntelliJ 15中编译)。Kotlin没有看到Java Lombok访问器?

println(myPojoInstance.foo) 

当它试图编译代码(的IntelliJ或摇篮)引用基于龙目岛的POJO它给出了错误“无法访问‘富’:它是‘私人’‘MyPojo’这是真的,他们'所有私人和我的对象有@Value @Builder的lombok注释

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

+1

你使用过'kapt'吗? http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/ – voddan

+0

正如@voddan指出的那样,您没有提供关于您尝试使用的内容的足够信息解决这个问题。此外,如果您尝试Kapt,它是在一个模块还是多个模块中。 –

+1

直到“kapt”被提及时,我才意识到有任何东西可以尝试解决它。我反复阅读JetBrains页面“java-interop”,找不到任何暗示如何处理它的东西。 IntelliJ不会在编辑器中将其标记为错误,但在IntelliJ和Gradle(通过JetBrains kotlin gradle插件)中编译都不起作用。 –

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

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

+2

嗯,该死。是的,我已经在我的程序中取了一大堆Java,并专门将它移植到Kotlin,以了解Java-> Kotlin-> Java支持是如何工作的。目标是随着时间迁移代码。但是,我们在所有域名POJO中都使用了Lombok。也许我可以在compileJava之前破解一个“compilePOJOs”目标。 –

+2

谢尔盖,有JetBrains链接/常见问题解答,了解Kotlin如何查看位于同一地点的Java代码(相同的模块)? Gradle在compileJava之前执行compileKotlin,但显然Kotlin知道Java代码(除了注释预处理)。在编译.kt文件之前,Kotlin编译器是否扫描Java代码? –

+2

你并不孤单,我们有Spring Roo生成了POJO,而Kotlin也没有看到它们,因为Sergey说过的原因相同。 – user2138356

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

为了增加谢尔盖马史克夫的反应(加在这里我没有足够的代表处点对此发表评论),这里有一个摇篮多项目设置的example app Kotlin可以看到Lombok生成的代码(没有kapt或去嵌套处理),注意事项的确适用 - 即Kotlin可以调用Java代码,但Java不能调用该特定模块中的Kotlin代码(因为这会创建循环依赖) 。如果你有一个现有的Java代码库,并且所有的新代码都是用Kotlin编写的,这种构建可能是合适的,但是,我很乐意看到完整的Lombok/Kotlin支持,尽管Kotlin与Java完全互操作,实际情况是Lombok使用非常广泛,而这个问题可能会阻止大量希望切换到Kotlin的开发人员。