使用了lombok后如何生成正确源码包

发表时间:2024-11-02 21:41

使用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中可选激活,其实本身这个也只有在发布代码的时候才会有用,本地调试是没用的,这样不会有任何影响;


联系我们
服务热线
深圳公司:深圳市龙华区明珠支路源创空间科技园南区2栋503、605

东莞公司:东莞市塘厦镇四村八达高新产业园9栋1楼

7*24全国服务热线
0755-8320 8959 紧急联系 :13632796137