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

如何用Maven仅打包指定类及其所需依赖?

仅打包指定类及其依赖的Maven配置方案

针对你想打包指定类(如A类)及其依赖的需求,先指出你当前maven-shade-plugin配置的几个核心问题,再给出最优配置方案:

原配置的问题

  1. 插件版本过旧:2.3是多年前的旧版本,存在不少兼容性和功能bug,建议升级到最新稳定版(如3.5.1)
  2. 全局Filter范围错误:你用*:*的artifact过滤器,导致所有第三方依赖包也被限制为只能包含你列举的com/A.class、com/B.class和commons类,这会遗漏A类实际依赖的其他必要类
  3. 手动列举依赖效率低:手动写所有需要的依赖类容易遗漏,应该利用插件的自动精简功能

最优自动精简配置方案

下面的配置会自动分析A类的依赖链,仅打包运行所需的类和依赖,无需手动列举所有依赖:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <!-- 使用最新稳定版 -->
    <version>3.5.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <!-- 核心:自动剔除未被A类直接/间接依赖的类和包 -->
                <minimizeJar>true</minimizeJar>
                <!-- 可选:如果需要生成可执行JAR,指定主类全限定名 -->
                <mainClass>com.A</mainClass>
                <artifactSet>
                    <includes>
                        <!-- 包含当前项目的所有类(后续minimize会自动剔除不需要的) -->
                        <include>你的项目groupId:你的项目artifactId</include>
                        <!-- 如果你确定某个依赖必须完整包含,可单独指定,比如commons组件 -->
                        <include>org.apache.commons:commons-lang3</include>
                    </includes>
                </artifactSet>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <!-- 排除签名文件,避免打包后运行时签名验证错误 -->
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

关键参数解释

  • <minimizeJar>true</minimizeJar>:插件会扫描字节码,分析A类的依赖链,自动移除所有未被使用的类和依赖包,这是实现“仅打包必要内容”的核心
  • <mainClass>:如果需要生成可执行JAR,填写A类的全限定名(如com.A),之后可以用java -jar target/xxx-shaded.jar直接运行
  • <artifactSet>:明确包含当前项目和必须保留的依赖,避免插件误删核心依赖

手动精确控制类范围的备选方案

如果你想严格控制自己项目中只包含A、B类,第三方依赖保留完整内容,可以修改过滤器配置,区分自己项目和第三方依赖:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.5.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <mainClass>com.A</mainClass>
                <filters>
                    <!-- 仅保留自己项目中的A、B类 -->
                    <filter>
                        <artifact>你的项目groupId:你的项目artifactId</artifact>
                        <includes>
                            <include>com/A.class</include>
                            <include>com/B.class</include>
                        </includes>
                    </filter>
                    <!-- 第三方依赖保留全部内容,仅排除签名文件 -->
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

运行与验证

执行命令:

mvn clean package

打包后的JAR文件在target目录下,命名格式为[项目名]-[版本号]-shaded.jar,可以用jar tf target/xxx-shaded.jar查看包内内容,确认只有A、B类及其依赖类被包含。

注意事项

如果使用<minimizeJar>后出现ClassNotFoundException,大概率是因为某些类是通过反射加载的(插件无法自动检测到),此时需要手动将这些类添加到<includes>中,比如:

<filter>
    <artifact>你的项目groupId:你的项目artifactId</artifact>
    <includes>
        <include>com/A.class</include>
        <include>com/B.class</include>
        <include>com/反射加载的类.class</include>
    </includes>
</filter>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:05:23