如何用Maven仅打包指定类及其所需依赖?
仅打包指定类及其依赖的Maven配置方案
针对你想打包指定类(如A类)及其依赖的需求,先指出你当前maven-shade-plugin配置的几个核心问题,再给出最优配置方案:
原配置的问题
- 插件版本过旧:2.3是多年前的旧版本,存在不少兼容性和功能bug,建议升级到最新稳定版(如3.5.1)
- 全局Filter范围错误:你用
*:*的artifact过滤器,导致所有第三方依赖包也被限制为只能包含你列举的com/A.class、com/B.class和commons类,这会遗漏A类实际依赖的其他必要类 - 手动列举依赖效率低:手动写所有需要的依赖类容易遗漏,应该利用插件的自动精简功能
最优自动精简配置方案
下面的配置会自动分析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
相关产品推荐
相关产品推荐

