Question
在使用Kotlin之前,我们曾经大量使用Lombok用来减少模版代码的编写,在Kotlin成名之后,我们迫不及待的切换到Kotlin下开发,但是Lombok却带来了不太友好的历史问题。

AppUserJava.java
@Getter
public class AppUserJava {
private String name;
private int age;
public AppUserJava(String name, int age) {
this.name = name;
this.age = age;
}
}
Kotlin调用
fun main(args: Array<String>) {
val b: AppUserJava = AppUserJava("liying", 24)
println(b.age)
}
一看没有问题啊,有了@Getter
标签,Lombok会帮我们生成所有Field的getter,然后Kotlin调用,思路没有任何问题,但是却报了图中的编译错误,为什么呢?
打印出一个正确的编译流程:

图中的2个箭头反应了错误的发生原因,因为是先编译的kotlin,然后才编译Java,在编译Kotlin的时候,Java代码根本还没有编译,因此Lombok也没有自动生成代码,所以编译Kotlin就失败了

如图:执行task compileKotlin失败了。
解决方案
1.再来一张图

图中有4个箭头顺序依次是
:library:compileKotlin
,:library:compileJava
,:app:compileKotlin
,:app:compileJava
。所以发现编译流程有这样一个规律,先编译library层的代码,再编译app层的代码,也就是library层的所有代码(Kotlin和Java)都编译完了(Lombok生成代码也执行了)才会编译app层代码。所以是不是我们把Lombok修饰的代码放到library层就ok了,事实确实是如此。但是这种解决方案不够优雅,有一些弊端,尤其是那些之前没有分层的代码很糟糕,但确实能解决我们的问题。2.是否可以改变编译顺序呢,先编译Java后编译Kotlin?这只是一个猜测,还没有实践,看到本文有实践过的朋友欢迎留个言。
参考:
1.https://stackoverflow.com/questions/35517325/kotlin-doesnt-see-java-lombok-accessors/35530223#35530223
2https://github.com/rzwitserloot/lombok/issues/1169
网友评论