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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:58:13