如何减小maven-assembly-plugin生成的jar包体积 仅2依赖就达110MB
Maven 含依赖 jar 包体积过大优化方案
你使用的两个依赖本身包含大量传递依赖,是jar包体积异常大的核心原因,可通过以下步骤逐步优化:
1. 排除冗余传递依赖
ApacheJMeter_Java默认携带大量你大概率用不到的JMeter功能组件、日志实现、测试框架等传递依赖,Selenium Java默认包含所有浏览器的驱动绑定、多余工具包,可通过以下方式处理:
- 执行
mvn dependency:tree查看完整依赖树,标记所有未用到的传递依赖 - 在pom的依赖声明中通过
<exclusions>标签排除冗余项,示例配置如下:
<!-- 排除ApacheJMeter_Java的冗余依赖 --> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>你的实际版本号</version> <exclusions> <!-- 排除多余日志实现 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <!-- 排除用不到的JMeter组件,比如HTTP采样器、FTP采样器等 --> <exclusion> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_http</artifactId> </exclusion> <exclusion> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_ftp</artifactId> </exclusion> </exclusions> </dependency>
- 对Selenium Java做同理排除:如果你只用Chrome浏览器,直接排除firefox、edge、IE、safari等其他浏览器的驱动依赖即可。
2. 替换打包插件为maven-shade-plugin
maven-assembly-plugin默认只会全量打入所有依赖,不做去重和裁剪,推荐使用maven-shade-plugin,它支持依赖去重、类裁剪功能,配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 开启类裁剪,仅打包代码实际用到的类 --> <minimizeJar>true</minimizeJar> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> </execution> </executions> </plugin>
注意:如果你的代码中存在反射加载类的逻辑,需要在插件配置中手动添加
<include>规则引入对应类,避免运行时出现类找不到异常。
3. 排除冗余资源文件
依赖包中存在大量非必要的资源文件,可以在打包时直接排除,在maven-shade-plugin的configuration节点中添加如下过滤规则:
<filters> <filter> <artifact>*:*</artifact> <excludes> <!-- 排除签名文件、证书文件 --> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> <!-- 排除开源协议、说明文档 --> <exclude>META-INF/LICENSE*</exclude> <exclude>META-INF/NOTICE*</exclude> <exclude>META-INF/README*</exclude> <!-- 可根据你的实际情况排除不需要的配置、静态资源文件 --> </excludes> </filter> </filters>
4. 进阶优化(可选)
- 如果你使用Java 9及以上版本,可通过jlink裁剪JRE,仅打包用到的JDK模块,进一步降低整体发布包体积
- 升级依赖到最新稳定版,高版本依赖通常会做一定的体积优化,也会拆分更细的子模块方便按需引入
内容的提问来源于stack exchange,提问作者Pratiksha Jadhav
相关产品推荐
相关产品推荐

