maven工程中jar包瘦身的五种方法

 更新时间:2021年02月05日 14:51:40   作者:涛声依旧(竞涛)  
这篇文章主要介绍了maven工程中jar包瘦身的五种方法,帮助大家更好的理解和使用maven,感兴趣的朋友可以了解下

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>

以上就是maven工程中jar包瘦身的五种方法的详细内容,更多关于maven工程中jar包瘦身的资料请关注脚本之家其它相关文章!

相关文章

  • Java编程long数据类型的使用问题

    Java编程long数据类型的使用问题

    这篇文章主要介绍了Java编程数据类型long的使用问题,涉及长整型数据的取值范围和不同整数类型的表示方法,需要的朋友可以参考下
    2017-09-09
  • Spring自动注入失败的解决方法

    Spring自动注入失败的解决方法

    这篇文章主要介绍了Spring自动注入失败的解决方法,帮助大家更好的理解和学习使用Spring框架,感兴趣的朋友可以了解下
    2021-05-05
  • Java编程实现暴力破解WIFI密码的方法分析

    Java编程实现暴力破解WIFI密码的方法分析

    这篇文章主要介绍了Java编程实现暴力破解WIFI密码的方法,结合具体实例形式分析了java暴力破解WiFi密码的原理、操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2018-12-12
  • 新手了解java基础知识(一)

    新手了解java基础知识(一)

    这篇文章主要介绍了Java基础知识,本文介绍了Java语言相关的基础知识、历史介绍、主要应用方向等内容,需要的朋友可以参考下,希望对你有所帮助
    2021-07-07
  • java ArrayList中的remove方法介绍

    java ArrayList中的remove方法介绍

    大家好,本篇文章主要讲的是java ArrayList中的remove方法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 别在Java代码里乱打日志了,这才是正确的打日志姿势

    别在Java代码里乱打日志了,这才是正确的打日志姿势

    这篇文章主要介绍了别在Java代码里乱打日志了,这才是正确的打日志姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • java实现在性能测试中进行业务验证实例

    java实现在性能测试中进行业务验证实例

    这篇文章主要为大家介绍了java实现在性能测试中进行业务验证实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • java.math.BigDecimal的用法及加减乘除计算

    java.math.BigDecimal的用法及加减乘除计算

    这篇文章主要介绍了java.math.BigDecimal的用法及加减乘除计算,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • java图片和文本同时提交到表单的实例代码

    java图片和文本同时提交到表单的实例代码

    在本篇文章里小编给大家整理的是关于java实现图片和文本同时提交到表单的相关内容,有需要的朋友们可以学习下。
    2020-02-02
  • spring aop代理控制的操作方式

    spring aop代理控制的操作方式

    spring aop可通过参数proxyTargetProxy控制创建代理的方式,本文重点给大家介绍spring aop代理控制的操作方式,需要的朋友可以参考下
    2022-04-04

最新评论