Kotlin没有看到Java Lombok访问器?


71

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

println(myPojoInstance.foo)

当它尝试编译引用基于Lombok的POJO的代码(在IntelliJ或Gradle中)时,出现错误“无法访问'foo':在“ MyPojo”中为'private'。是的,它们都是私有的,而我的对象有@Value @Builder用于lombok批注。

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



正如@voddan指出的那样,您没有提供足够的信息来尝试解决此问题。同样,如果您尝试过Kapt,它是在一个模块中还是在多个模块中。
杰森·米纳德'02

3
在提到“ kapt”之前,我一直不知道有什么方法可以尝试解决它。我反复阅读了JetBrains页面“ java-interop”,找不到任何暗示如何处理它的信息。IntelliJ不会在编辑器中将其标记为错误,但是在IntelliJ和Gradle中进行编译(通过JetBrains kotlin gradle插件)均无效。
克里斯·凯塞尔

1
您设法解决了这个问题kapt吗?我很想知道。
Vojtěch

Answers:


68

通常,不,不是。该行为的原因是Lombok是javac的注释处理器,但是当kotlin编译器运行时,它也使用javac但没有注释处理,因此这就是为什么kotlin看不到尚未生成的声明的原因。

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


2
好吧,该死。是的,我在程序中间使用了一部分Java并将其迁移到Kotlin专门是为了了解Java-> Kotlin-> Java支持将如何工作。目标是随着时间的推移迁移代码。但是,我们在所有域POJO中都大量使用Lombok。也许我可以破解一个“ compilePOJOs”目标以在compileJava之前运行。
克里斯·凯塞尔

2
Sergey,是否有JetBrains链接/常见问题解答,以了解Kotlin如何查看位于同一位置的Java代码(相同的模块)?Gradle在compileJava之前先执行compileKotlin,但显然Kotlin知道Java代码(除了注释预处理之外)。Kotlin编译器在编译.kt文件之前会扫描Java代码吗?
克里斯·凯塞尔

2
您并不孤单,我们有Spring Roo生成的POJO,而由于Sergey所说的相同原因,Kotlin也看不到它们。
fasth '16

22
对于我们来说,这也是一个真正的突破。我们想在我们的应用程序中引入Kotlin,它们在很大程度上依赖于lombok数据类和Builder的类。轻易将其视为“我对使用Lombok表示了什么……”,但是事实仍然是,这将阻止许多人开始考虑使用Kotlin。
Billybong

1
@Billybong可以帮助使用DeLombok的项目:projectlombok.org/features/delombok.html可以在源代码中包含Lombok生成的Java代码,然后就可以从项目中删除Lombok。
Pedro Hidalgo

5

为了增加谢尔盖·马什科夫(Sergey Mashkov)的响应(在这里添加,我没有足够的代表评论),这是一个Gradle多项目设置的示例应用,其中Kotlin可以查看Lombok生成的代码(无需kapt或delomboking。确实适用-也就是说,Kotlin可以调用Java代码,但是Java不能在该特定模块中调用Kotlin代码(因为这会产生循环依赖)。如果您已有现有的Java代码库并且不过,所有新代码都是用Kotlin编写的。

但是,我希望看到Lombok / Kotlin的全力支持。尽管Kotlin可以与Java完全互操作,但事实是Lombok的使用非常广泛,这个问题可能会阻止许多想要切换到Kotlin的开发人员这样做。


4

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

2

如果您根据站点使用delombok并在build> plugins> plugin> kotlin-maven-plugin下的pom.xml中添加target / generate-sources / delombok文件夹,则看起来可行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.