如何用Maven Shade Plugin在编译和构建时移除依赖中的类?
解决Maven Shade Plugin无法移除依赖类的问题
你的问题核心是Spring Boot Maven Plugin的repackage目标会覆盖Shade插件生成的Jar包,导致过滤规则不生效。以下是针对性的解决方案,同时可以实现只保留dto类、移除指定类的需求。
一、核心问题分析
Spring Boot Maven Plugin默认在package阶段执行repackage目标,它会重新生成可执行Jar,覆盖Shade插件之前生成的Jar,因此Shade的类过滤规则不会生效。
二、解决方案步骤
1. 调整插件执行逻辑,避免Jar覆盖
有两种可行方式:
方式A:禁用Spring Boot自动repackage,让Shade生成可执行Jar
修改Spring Boot插件配置,跳过自动repackage,同时在Shade插件中配置Spring Boot所需的Manifest信息(指定主类):
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 跳过自动repackage,由Shade插件处理打包 --> <skip>true</skip> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 类过滤规则:只保留dto,移除指定类和entity包 --> <filters> <filter> <artifact>org.mua.dev:models</artifact> <includes> <include>org/mua/dev/models/dto/**</include> </includes> <excludes> <exclude>org/mua/dev/models/Event.class</exclude> <exclude>org/mua/dev/models/BaseEvent.class</exclude> <exclude>org/mua/dev/models/entity/**</exclude> </excludes> </filter> </filters> <!-- 配置Spring Boot可执行Jar所需的Transformer --> <transformers> <!-- 替换为你的Spring Boot启动类全路径 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.mua.dev.learn.LearnApplication</mainClass> </transformer> <!-- 合并服务配置文件,避免Spring Boot自动配置失效 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>
方式B:让Spring Boot基于Shade生成的Jar进行repackage
配置Shade生成附加Jar,然后让Spring Boot插件对该附加Jar执行repackage:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>repackage</goal> </goals> <configuration> <!-- 指定基于Shade生成的附加Jar进行repackage --> <classifier>shaded</classifier> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 生成附加Jar,分类器为shaded --> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>shaded</shadedClassifierName> <!-- 类过滤规则 --> <filters> <filter> <artifact>org.mua.dev:models</artifact> <includes> <include>org/mua/dev/models/dto/**</include> </includes> <excludes> <exclude>org/mua/dev/models/Event.class</exclude> <exclude>org/mua/dev/models/BaseEvent.class</exclude> <exclude>org/mua/dev/models/entity/**</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
2. 验证配置有效性
执行以下命令清理并重新构建:
mvn clean package
构建完成后,解压生成的Jar包,检查org/mua/dev/models目录下的类是否符合预期。
三、注意事项
- 主类路径要准确:替换配置中的
org.mua.dev.learn.LearnApplication为你实际的Spring Boot启动类全路径。 - 类路径要匹配:如果
Event或BaseEvent位于子包中,需要调整<exclude>的路径,例如若在org/mua/dev/models/event/下,路径应为org/mua/dev/models/event/Event.class。 - 必须清理缓存:每次修改配置后执行
mvn clean,避免之前的构建产物影响结果。
内容的提问来源于stack exchange,提问作者Maifee Ul Asad
相关产品推荐
相关产品推荐

