Maven项目分析剔除无用jar引用的方法步骤

所属分类: 软件编程 / java 阅读数: 32
收藏 0 赞 0 分享

一、为什么要做这件事?

项目持续研发,不停地在上面新增功能,新增特性,引入新的框架和组件,jar包依赖多并且复杂,再加上需求各种变更,有不少已经存在的功能下线,但jar包依赖没人管,还是放在项目的pom.xml文件里。项目持续的时间一长,经常会出现项目打包要求内存多,时间慢的问题,如何分析项目中哪些依赖是有用的,哪些可以剔除的,一方面减轻打包内存占用多,时间慢的问题,另一方面照顾研发童鞋的强迫症问题(容不得半点无用jar包在我的项目里),这事就可以提上日程了。

二、怎么做?

如果是Maven项目,执行起来还是比较简单,Maven自己提供了一个检测工具,输入命令即可。

在IDEA中,切换到Terminal窗口,或者用命令行打开相应工程目录,直接输入

mvn dependency:analyze

查看控制台输出的日志,重点关注这两部分:

[WARNING] Used undeclared dependencies found:
[WARNING]  com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
[WARNING]  com.fasterxml.jackson.core:jackson-databind:jar:2.9.9:compile
[WARNING]  io.jsonwebtoken:jjwt:jar:0.9.0:compile
[WARNING]  org.apache.rocketmq:rocketmq-common:jar:4.5.2:compile
[WARNING]  org.springframework:spring-beans:jar:5.1.8.RELEASE:compile
[WARNING]  com.google.code.gson:gson:jar:2.8.0:compile
[WARNING]  org.springframework.boot:spring-boot:jar:2.1.6.RELEASE:compile
[WARNING]  com.fasterxml.jackson.core:jackson-core:jar:2.9.9:compile
[WARNING]  org.springframework:spring-core:jar:5.1.8.RELEASE:compile
[WARNING]  org.apache.rocketmq:rocketmq-remoting:jar:4.5.2:compile
[WARNING] Unused declared dependencies found:
[WARNING]  org.projectlombok:lombok:jar:1.16.20:provided
[WARNING]  org.springframework.boot:spring-boot-starter-test:jar:2.1.6.RELEASE:test

Used undeclared dependencies found

间接依赖,就是说你在当前项目工程的pom.xml里没有直接声明,这个依赖是由你声明过的dependency里的pom.xml依赖传递得来的。

例如org.apache.rocketmq:rocketmq-common:jar:4.5.2:compile是你引用了这个:

<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-client</artifactId>
  <version>4.5.2</version>
</dependency>

Maven本来就是这样用的,也不建议说你把这部分引用拷贝到你的pom.xml里,一般来说这部分的WARNING可以忽略。

Unused declared dependencies found

无用依赖,这个指我们在pom.xml声明了这个jar包的依赖,但在项目工程里没有使用到,这个不是我们此次关注的重点,确定不需要,就可以剔除掉这个依赖,Reimport后这个jar包就从我们项目中剔掉了。

三、什么时候做?

1)新项目建立时,引用jar包时要慎重,不要一股脑儿直接拷贝老项目的依赖,避免后期又花时间来剔除。
2)功能代码重构时,可以适当做一次剔除,因为后面还有自测,提交测试环节,如果有误删,测试的时候能发现。

四、有什么风险要注意的?

1)这个检测的结果仅供参考,有时也不准确,如上文提及的org.projectlombok:lombok:jar:1.16.20:provided,实际上在项目中有使用到它的注解@Data,这个属于误判。要注意剔除依赖后多测试,工具毕竟有毕竟的缺陷性。
2)如果童鞋们接手遗留的老项目时,这种问题肯定很多,但刚接手时不建议做这个操作,因为本身对项目不熟悉,上来就删东西导致问题会浪费很多时间和精力搞定依赖的问题,这块东西建议暂时先不要动。

五、补充一个小插件

查看pom.xml的依赖关系时,可以在IDEA上安装maven help插件,可以直观地看到各jar依赖关系

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多