maven工程中jar包瘦身的五种方法
作者:涛声依旧(竞涛) 发布时间:2023-11-04 05:01:54
java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,给jar包进行瘦身,是一项必备技能。下面介绍在maven工程中jar包瘦身五 * :
一、将环境中已包含的依赖包的scope设置为provided
pom中依赖的部分包可能在你程序运行环境中已经包含,此时应该将依赖包的scope设置为provided。如protobuf包如在环境中已包含,则应设置为:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>${protobuf.version}</version>
<scope>provided</scope>
</dependency>
二、删除未使用依赖
在pom文件配置时可能加入的某些依赖包并没有真正被使用到,那么有没有一种有效的方式找到没有被使用到的依赖包呢?答案是Apache Maven Dependency Plugin。
安装Apache Maven Dependency Plugin插件并运行mvn dependency:analyze命令来分析项目的依赖关系,并确定哪些依赖是:使用且声明的、使用且未声明的和未使用且声明的。将未使用且声明的的依赖从pom文件中去除即可。
如果你使用的是Spring Boot,可以直接添加这个插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
</plugins>
</build>
三、去除重复依赖
在pom文件中有些依赖可能在<dependencies/>
或<dependencyManagement/>
中被重复配置,或者父子项目配置中可能同一个依赖包被重复配置。可通过Apache Maven Dependency Plugin
插件并运行mvn dependency:analyze-duplicate
命令来检查项目的重复依赖,然后删除重复依赖项即可。
四、解决依赖冲突
项目中不同的依赖包可以同时依赖另一个包,而这个嵌套依赖的包可能版本不一致,这可能导致程序无法正常运行,或者运行过程中产生一些很诡异的问题。
那如何方便地找到所有的依赖冲突项并解决呢?在intellij中安装maven helper插件可快速找出有冲突的包。
安装完maven helper后,然后打开pom文件,并从Text模式切换到Dependency Analyzer模式,选中Conflicts按钮,可清晰地看到有冲突依赖包都被标红显示出来了。
选中红色嵌套包并右键选择Exclue即可,实际的效果是在pom文件中对应的dependency下将嵌套包exclusion出去了。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.manager}</version>
<exclusions>
<exclusion>
<artifactId>jboss-logging</artifactId>
<groupId>org.jboss.logging</groupId>
</exclusion>
</exclusions>
</dependency>
某些场景下exclusion冲突的不同版本的依赖包会导致程序无法执行,可能的原因是该依赖包无法在其嵌套包的其他版本下正常运行。此时可能需要尝试找一个新版本的依赖包使其依赖的嵌套包能与其他依赖包达到兼容。
五、去除指定文件
如果采取了上面几个步骤后还是无法达到jar包有效瘦身的目标,那就只能使用最终大杀器:将不需要的指定文件或者文件夹从最终的jar包中移除。
之所以有不需要的文件被打到jar包,一方面可能工程中包含了一些非代码的工程文件,如项目文档等;另一方面可能你依赖的jar包中包含了不需要的冗余文件。
使用maven-shade-plugin
插件可将匹配特定条件的文件从jar包中移除。如下所示,配置exclude项可从最终的jar包中去除匹配特定条件的文件或文件夹(可以是配置文件,也可以是代码文件)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>uber-jar</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.artifactId}-${project.version}-jar-with-dependencies</finalName>
<filters>
<filter>
<artifact>*:* </artifact>
<excludes>
<exclude>LICENSE</exclude>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
来源:https://blog.csdn.net/qq_27639777/article/details/89944806


猜你喜欢
- 什么是Stream流?Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream的优点:声明性,可复合,可并行。
- SpringBoot使用过滤器、 * 和 * 一、SpringBoot使用过滤器Spring boot过滤器的使用(两种方式)使用sprin
- 不同的加锁顺序我们来看一个不同加锁顺序的例子:public class DiffLockOrder {private int amount;
- 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一
- 命令模式命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳
- 自从接触javascript以来,对this参数的理解一直是模棱两可。虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪。但对于
- 一、分析这篇将会讲解撤销反撤销功能的实现,先讨论一下这个原理是怎么样实现的。每次撤回的内容,内容是怎么定义呢? 其实就是每一笔,每一笔作为撤
- 接口:Writerablepackage com.geoway.pad.common; import java.io.DataInput;
- 关联篇:HandlerThread 使用及其源码完全解析关联篇:Handler内存泄漏详解及其解决方案一说到Android的消息机制,自然就
- GoogleNow是Android4.1全新推出的一款应用他,它可以全面了解你的使用习惯,并为你提供现在或者未来可能用到的各种信息,Goog
- 将一个项目导入最烦的是遇到各种报错,前段时间搞的一个项目,各个功能模块单独作为一个工程,然后不同工程之间相互调用,这里会报这么一个·错误a
- OutputDebugString属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了。可以把调
- Toast是一种简易的消息提示框,它无法获取焦点,按设置的时间来显示完以后会自动消失,一般用于帮助或提示。先给大家分享下我的解决思路:不用计
- 本文实例为大家分享了UnityShader使用Plane实现翻书效果的具体代码,供大家参考,具体内容如下之前在网上看到一个Shadr可以实现
- 一、前言Hello,又见面了,今天分享如何使用Unity制作计算器,难度中等,可以用来学习,或者当成其他项目的小组件导入。当然,也可以导出来
- 设置超时时间设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时
- 前言Activity可以获取运行中的应用信息,可以获取到servcie,process,app,memory,Task信息等。获取信息Act
- 先看看效果图:1、XML布局引入<com.net168.lib.SortTabLayout android:id=&quo
- import java.lang.reflect.InvocationHandler;import java.lang.reflect.Me
- 项目地址:https://github.com/JeasonWong/SlackLoadingView老规矩,先上效果。图好大。。说下第一眼