使用了lombok后如何生成正确源码包发表时间:2024-11-02 21:41 使用lombok后,如果没有任何配置,则打包的源码与实际class文件是不符合的,此时打开源码IDEA会提示Library source does not match the bytecode for class,而解决该问题也很简单,只需要pom中增加如下配置即可,打包时指定maven参数 <properties> <!-- 原始源码目录,我们后边要将源码目录切换到delombok.dir中 --> <origin.source.dir>src/main/java</origin.source.dir> <!-- 打包生成source时使用的目录 --> <source.generate.dir>src/main/java</source.generate.dir> <!-- lombok生成源码的目录 --> <delombok.dir>${project.build.directory}/delombok</delombok.dir> </properties> <build> <!-- 使用delombok生成的源码目录作为项目的源码目录 --> <sourceDirectory>${source.generate.dir}</sourceDirectory> </build> <profiles> <profile> <!-- 发布profile --> <id>release</id> <properties> <!-- 源码目录切换到delombok目录 --> <source.generate.dir>${delombok.dir}</source.generate.dir> </properties> <build> <plugins> <!-- lombok插件,用于将源码中的lombok相关注解替换为对应的代码 --> <plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>1.18.16.0</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <!-- 指定要解除lombok注释的代码在这个目录中 --> <sourceDirectory>${origin.source.dir}</sourceDirectory> <!-- delombok后的源码默认是输出到target/generated-sources/delombok目录中的,这里我们修改输出到我们指定的目录,因为 如果输出到target/generated-sources中会导致IDEA也将其识别为源码,最终就是导致IDEA报错,因为class重复 --> <outputDirectory>${delombok.dir}</outputDirectory> </configuration> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>delombok</goal> </goals> </execution> </executions> </plugin> <!-- Source --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <!-- Javadoc --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <!-- jdk1.8要加上,1.7要去掉,否则会报错 --> <additionalJOptions> <additionalJOption>${javadoc.opts}</additionalJOption> </additionalJOptions> </configuration> </plugin> </plugins> </build> </profile> <!-- 禁用注释检查 --> <profile> <id>disable-javadoc-doclint</id> <activation> <jdk>[1.8,)</jdk> </activation> <properties> <javadoc.opts>-Xdoclint:none</javadoc.opts> </properties> </profile> </profiles> 原理:首先我们要知道Lombok的大概原理,Lombok其实就是在源码处理阶段将Lombok相关注解生成了对应的代码,最终编译时使用的是Lombok生成的源码,但是打包源码时又是使用的我们真正的源码而不是Lombok生成的源码,所以在其他人使用的时候才会提示源码与字节码不匹配,而我们只需要指定Lombok生成的源码作为我们最终生成的源码即可;而maven打包source时默认使用 注意,这里有个细节,就是源码目录的切换我们放到了profile中,而不是全局,为什么这么做呢?因为如果直接在全局修改源码目录,IDEA也会从该目录读取源码,最终会导致类冲突(编译后,如果编译后又clean了不会有该问题),因为我们本身存在一份代码,而Lombok编译后又提供了一份源码,两份源码几乎是一模一样的(除了Lombok注解替换成了代码),所以IDEA会提示类冲突,为了不影响我们正常的开发调试,就把这个功能放到了profile中可选激活,其实本身这个也只有在发布代码的时候才会有用,本地调试是没用的,这样不会有任何影响; |