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

标签:maven,jar包,瘦身
0
投稿

猜你喜欢

  • java selenium教程之selenium详细介绍

    2023-07-30 13:53:52
  • CentOS 7系统下配置自定义JDK的教程

    2022-02-27 13:46:26
  • C#中datatable序列化与反序列化实例分析

    2021-10-13 10:53:06
  • java8 stream多字段排序的实现

    2021-07-30 17:47:47
  • C#获取所有进程的方法

    2022-06-13 16:02:24
  • Flutter如何轻松实现动态更新ListView浅析

    2023-05-23 09:32:37
  • 浅谈Android View绘制三大流程探索及常见问题

    2022-03-02 00:01:26
  • SpringBoot--- SpringSecurity进行注销权限控制的配置方法

    2022-11-11 03:49:54
  • c++禁止函数的传值调用的方法

    2022-12-02 13:35:09
  • c# 如何将字符串转换为大写或小写

    2023-01-04 20:44:28
  • LRU缓存替换策略及C#实现方法分享

    2021-08-27 04:20:49
  • Android自定义ScrollView实现阻尼回弹

    2021-11-23 07:20:19
  • C#中的Linq Intersect与Except方法使用实例

    2021-11-30 01:25:52
  • C#调用新浪微博API实例代码

    2022-12-21 14:02:15
  • Java去掉数字字符串开头的0三种方法(推荐)

    2022-05-31 08:04:41
  • 基于idea 的 Java中的get/set方法之优雅的写法

    2023-11-26 20:22:50
  • Android实现购物车及其他功能的角标

    2021-12-24 10:54:54
  • Java中synchronized正确使用方法解析

    2021-12-20 13:00:39
  • 详解Java语言中一个字符占几个字节?

    2023-08-26 11:45:40
  • 10分钟带你理解Java中的弱引用

    2023-02-09 10:35:55
  • asp之家 软件编程 m.aspxhome.com