首页 文章

Kotlin没有看到Java Lombok访问器?

提问于
浏览
46

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

println(myPojoInstance.foo)

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

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

4 回答

  • 39

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

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

  • 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

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

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

  • 0

    看起来如果根据site使用delombok并在build> plugins> plugin> kotlin-maven-plugin下的pom.xml中添加target / generated-sources / delombok文件夹

相关问题