类继承场景下Lombok与javac编译冲突问题:Eclipse正常但javac编译子类时父类报错
这个问题的核心在于javac编译子类时的自动依赖处理逻辑和Lombok注解处理器的工作方式:
当你单独编译子类LombokInheritanceProblem_ChildClass.java时,javac发现它依赖父类LombokInheritanceProblem_BaseClass,但父类还没有生成对应的class文件,所以javac会自动去编译父类的源码文件。但这个时候,javac编译父类源码时没有正确触发Lombok的注解处理器,导致父类源码里的toLower()扩展方法没有被转换成合法的Java代码,于是就出现了"找不到符号"的错误。
而你单独编译父类时,命令行明确指定了父类文件,Lombok处理器正常工作,把扩展方法调用转换成了AOPString.toLower(...)的形式,所以编译成功。
Eclipse之所以没问题,是因为Lombok的IDE插件会实时处理所有类的注解,并且Eclipse会自动管理类的编译顺序,确保父类的注解先被处理完成,不会出现这种编译时的注解缺失问题。
这里有两种可靠的解决方法:
方法1:一次性编译所有相关的Java文件
把父类和子类的文件都放在javac命令里,这样Lombok注解处理器会同时处理两个类的注解,避免javac自动编译父类时的注解遗漏:
"C:\Program Files\Java\jdk1.8.0_181\bin\javac.exe" D:\workspace\Test\src\stackoverflow\lombok\inheritanceproblem\LombokInheritanceProblem_BaseClass.java D:\workspace\Test\src\stackoverflow\lombok\inheritanceproblem\LombokInheritanceProblem_ChildClass.java -encoding utf8 -cp D:\lombok.jar -sourcepath D:\workspace\Test\src -d D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents
方法2:先编译父类,再编译子类
先执行你之前的命令编译父类,确保父类的class文件已经生成在输出目录。然后编译子类时,把父类的class目录加入classpath,这样javac会直接使用已编译好的父类class文件,而不会重新编译父类源码:
# 先编译父类(你已有的命令) "C:\Program Files\Java\jdk1.8.0_181\bin\javac.exe" D:\workspace\Test\src\stackoverflow\lombok\inheritanceproblem\LombokInheritanceProblem_BaseClass.java -encoding utf8 -cp D:\lombok.jar -sourcepath D:\workspace\Test\src -d D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents # 再编译子类,加入父类class目录到classpath "C:\Program Files\Java\jdk1.8.0_181\bin\javac.exe" D:\workspace\Test\src\stackoverflow\lombok\inheritanceproblem\LombokInheritanceProblem_ChildClass.java -encoding utf8 -cp D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents;D:\lombok.jar -sourcepath D:\workspace\Test\src -d D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents
额外优化:明确指定注解处理器路径
在Java 8中,虽然注解处理器可以放在classpath里,但使用-processorpath明确指定Lombok的路径,能更可靠地确保注解处理器被触发。比如编译子类时可以这样写:
"C:\Program Files\Java\jdk1.8.0_181\bin\javac.exe" D:\workspace\Test\src\stackoverflow\lombok\inheritanceproblem\LombokInheritanceProblem_ChildClass.java -encoding utf8 -processorpath D:\lombok.jar -cp D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents -sourcepath D:\workspace\Test\src -d D:\apps-jc\libs_test\JcLib__AOP_Lombok_Test\jar-contents
内容的提问来源于stack exchange,提问作者JayC667

