使用lombok后,如果没有任何配置,则打包的源码与实际class文件是不符合的,此时打开源码IDEA会提示Library source does not match the bytecode for class,而解决该问题也很简单,只需要pom中增加如下配置即可,打包时指定maven参数-Prelease
即可生成正确的源码包:
<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时默认使用sourceDirectory
作为源码目录,所以最终我们只需要将sourceDirectory
修改为Lombok生成源码的目录即可;
注意,这里有个细节,就是源码目录的切换我们放到了profile中,而不是全局,为什么这么做呢?因为如果直接在全局修改源码目录,IDEA也会从该目录读取源码,最终会导致类冲突(编译后,如果编译后又clean了不会有该问题),因为我们本身存在一份代码,而Lombok编译后又提供了一份源码,两份源码几乎是一模一样的(除了Lombok注解替换成了代码),所以IDEA会提示类冲突,为了不影响我们正常的开发调试,就把这个功能放到了profile中可选激活,其实本身这个也只有在发布代码的时候才会有用,本地调试是没用的,这样不会有任何影响;
联系我
-
微信公众号(文章会第一时间更新到公众号):代码深度研究院
-
GitHub:https://github.com/JoeKerouac