为何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>

问题根源与修复方案
为什么会出现这种情况?
- 子模块依赖配置问题:父pom里Lombok的
provided作用域没被子模块正确继承,或者某个子模块自己又声明了Lombok依赖却没设provided。provided表示这个依赖只在编译、测试阶段用,打包时不该包含,但如果子模块用了默认的compile作用域,就会把Lombok打包进去。 - Maven编译插件没配Lombok支持:当前pom里的maven-compiler-plugin只设置了JDK版本,没绑定Lombok的注解处理器。编译阶段Lombok没正确生成代码,可能导致相关文件残留被打包。
- 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
相关产品推荐
相关产品推荐

