You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Lombok文件会被打包进Maven构建的Jar包中?

问题

我们用Maven 3.6.0、JDK 1.8_331、Lombok 1.18.2,搭配Eclipse 2019-12构建项目。执行mvn clean install -DskipTests后,生成的Jar包里混了多余的Lombok类和文件,不仅增大了包体积,还引发了部署问题。相关pom.xml配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lntp.prod</groupId>
    <artifactId>LNTP</artifactId>
    <version>3.4.0</version>
    <packaging>pom</packaging>
    <name>LNTP</name>
    <description>LNTP Production</description>

    <repositories>
        <repository>
            <id>org.openspaces</id>
            <url>http://maven-repository.openspaces.org</url>
        </repository>
        <repository>
            <id>jcenter</id>
            <name>jcenter</name>
            <url>https://jcenter.bintray.com</url>
        </repository>
    </repositories>

    <modules>
        <module>LNTPServerModel</module>
        <module>LNTPServerBridge</module>
        <module>LNTPServerSpace</module>
        <module>LNTPServerEntities</module>
    </modules>

    <properties>
        <!-- general -->
        <java.version>1.8</java.version>
        <lntp.version>3.4.0</lntp.version>
        <lombok.version>1.18.2</lombok.version>
        <guava.version>20.0</guava.version>

        <!-- maven plugins -->
        <maven.compiler.version>3.7.0</maven.compiler.version>
        <maven.war.version>3.2.2</maven.war.version>
        <maven.assembly.version>3.1.0</maven.assembly.version>

        <!-- spring -->
        <spring.version>5.1.7.RELEASE</spring.version>

        <!-- 3d party artefactory -->
        <chardet.version>1.0</chardet.version>
        <log4j.version>1.2.16</log4j.version>
        <hibernate.version>5.4.2.Final</hibernate.version>
        <slf4j.version>1.7.5</slf4j.version>

        <!-- apache commons -->
        <commons.logging.version>1.1.3</commons.logging.version>
        <commons.dbcp.version>1.3</commons.dbcp.version>

        <!-- test -->
        <junit.version>4.8.1</junit.version>
        <java.mail.version>1.4.7</java.mail.version>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>

        <!-- 3Party -->
        <dependency>
            <groupId>org.mozilla.intl</groupId>
            <artifactId>chardet</artifactId>
            <version>${chardet.version}</version>
        </dependency>


        <dependency>
            <groupId>com.lntp.commons</groupId>
            <artifactId>lntp-commons</artifactId>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>${slf4j.version}</version>
            <scope>compile,test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons.logging.version}</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>${junit.version}</version>
        </dependency>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
       
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>${spring.version}</version>
        </dependency>
    

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>${java.mail.version}</version>
        </dependency>
    </dependencies>

    <build>
        <defaultGoal>package</defaultGoal>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                    <version>${maven.compiler.version}</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>${maven.assembly.version}</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>${maven.war.version}</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

Jar包内Lombok文件截图

问题根源与修复方案

为什么会出现这种情况?

  1. 子模块依赖配置问题:父pom里Lombok的provided作用域没被子模块正确继承,或者某个子模块自己又声明了Lombok依赖却没设provided。provided表示这个依赖只在编译、测试阶段用,打包时不该包含,但如果子模块用了默认的compile作用域,就会把Lombok打包进去。
  2. Maven编译插件没配Lombok支持:当前pom里的maven-compiler-plugin只设置了JDK版本,没绑定Lombok的注解处理器。编译阶段Lombok没正确生成代码,可能导致相关文件残留被打包。
  3. Eclipse构建残留:Eclipse自动构建生成的class文件,可能在Maven执行clean时没被彻底删掉,这些残留的Lombok相关文件被混进了Jar包。

怎么解决?

  • 统一子模块Lombok依赖配置:检查所有子模块的pom.xml,要么别单独声明Lombok依赖,直接继承父pom的配置;要么显式把Lombok的scope设为provided。
  • 给Maven编译插件加Lombok注解处理器:修改父pom里的maven-compiler-plugin配置,添加注解处理器路径,确保编译时正确处理Lombok注解:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
    <version>${maven.compiler.version}</version>
</plugin>
  • 彻底清理构建产物:执行Maven命令前,手动删掉所有子模块的target目录,或者确保mvn clean能彻底清除Eclipse生成的残留文件。
  • 升级Lombok版本:你用的Lombok 1.18.2太老了,有不少已知的打包bug,升级到1.18.30以后的版本能解决不少兼容性问题。

内容的提问来源于stack exchange,提问作者FullStack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:44:59