如何定位不需要的Jar依赖 loosejar工具和maven工具实践分析

这篇具有很好参考价值的文章主要介绍了如何定位不需要的Jar依赖 loosejar工具和maven工具实践分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mvn 工具依赖检查

在很多的项目中,往往都存在一些冗余的JAR包依赖,可能是某次的测试加入但是之后没有删除,可能是引用传递的依赖,也可能是历史代码但在后面升级后已经有其他的替换方案了,可没有剔除原先的依赖等等情况。想要更好的提升构建速度以及减少依赖存在漏洞的可能性,那么就需要从源头出发,优化项目相关的依赖JAR,剔除一些无用的依赖。我们可以通过mvn dependency:analyze的方式去分析依赖情况。

mvn dependency:analyze

使用该命令对项目进行了扫描分析,以下是分析结果,截取其中一部分

[INFO] --- maven-dependency-plugin:3.2.0:analyze (default-cli)  ---
[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-beans:jar:5.3.21:compile
[WARNING]    org.springframework:spring-jdbc:jar:5.3.21:compile
[WARNING]    org.springframework.boot:spring-boot:jar:2.6.9:compile
[WARNING]    org.springframework.security:spring-security-config:jar:5.6.6:compile
[WARNING]    org.springframework.cloud:spring-cloud-openfeign-core:jar:3.1.1:compile
[WARNING]    org.slf4j:slf4j-api:jar:1.7.36:compile
[WARNING]    xml-apis:xml-apis:jar:1.0.b2:compile
[WARNING]    jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[WARNING]    org.springframework.boot:spring-boot-test:jar:2.6.9:test
[WARNING]    org.junit.jupiter:junit-jupiter-api:jar:5.8.2:test
[WARNING]    org.springframework.amqp:spring-amqp:jar:2.4.6:compile
[WARNING]    com.alibaba:druid:jar:1.2.9:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.springframework.boot:spring-boot-starter-security:jar:2.6.9:compile
[WARNING]    org.thymeleaf.extras:thymeleaf-extras-springsecurity5:jar:3.0.4.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-starter-thymeleaf:jar:2.6.9:compile
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:2.6.9:compile
[WARNING]    org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.41:compile
[WARNING]    org.springframework.boot:spring-boot-configuration-processor:jar:2.6.9:compile
[WARNING]    org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:2.1.4:compile
[WARNING]    org.springframework.boot:spring-boot-starter-aop:jar:2.6.9:compile
[WARNING]    org.springframework.boot:spring-boot-devtools:jar:2.6.9:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:2.6.9:test
[WARNING]    org.springframework.boot:spring-boot-starter-data-redis:jar:2.6.9:compile
[WARNING]    redis.clients:jedis:jar:3.9.0:compile

如上图所示,可以看到俩行主要的提示

【Used undeclared dependencies found】

这个是指某些依赖的包在代码中有用到它的代码,但是它并不是直接的依赖(就是说没有在pom中直接声明),是通过引入传递下来的包。
即项目在pom中声明了A.jar的依赖(没有声明B.jar的依赖) ,但是A自己的依赖中引入了B.jar,说明project中的代码用到了B.jar的代码 这个时候你就可以把B.jar直接声明在pom中。

【Unused declared dependencies found】

这个是指我们在pom中声明了依赖,但是在实际代码中并没有用到这个包,也就是多余的包。这个时候我们就可以把这个依赖从pom中剔除。

运行时依赖检查loosejar工具

安装配置详细github官网地址

工作原理

loosejar的工作原理是利用classloader。由于应用在执行的时候,用到哪个类,classloader就会把这个类的.class文件载入到jvm中,然后生成一个class对象。然后再利用反射就能够执行这个类的方法了,因此有哪些.class文件被载入了,classloader能够清楚的知晓,利用这个特性,便可知道jar包中类的实际使用情况,以及应用中jar包的实际使用情况了。

依赖扫描

直接在本地的IDEA启动Java项目,并且指定启动VM参数
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全
【1】在项目启动成功后,通过jconsole工具查看当前类加载情况,并点击summary 查看类加载,将其内容复制到文本工具中。
【2】运行并测试项目中的相关功能,在正常运行一段时间后,再次通过jconsole工具查看当前类加载情况
【3】搜索关键词AppClassLoader,仅比较AppClassLoader下面的类加载信息。
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全
【4】将两次的分析结果记录下来,后面会进行分析比较。

Maven Helper工具使用

在进行依赖检查的时候,建议IDEA安装Maven Helper插件,在进行依赖分析以及排除的时候可以通过该工具帮助我们定位以及一键排除。
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全

结果分析

针对上面两次的扫描结果这里做简单的场景分析

【1】下面显示elasticsearch-geo依赖在两次扫描都没有被使用,结合目前的项目来看,确实在ES方面没有使用到geo相关的功能。
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全
【2】下面针对第二次扫描结果进行了0.00%引用依赖的计数查找,大概有188个,相对于mvn dependency:analyze来说,它的扫描结果更加广泛,同时loosejar基于运行时的结果实时分析,比静态分析也更加全面准确。
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全
【3】通过下图可以看到,在第二次扫描时原先被判定未引用的现在有依赖关系了,所以在使用该工具时一定要注意全面的测试,在判定某个特定的依赖是否要删除,做好检查。
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全
【4】对于该工具,可以将它集成到日常的开发中去,在保持运行一段时间后在进行依赖使用的分析,在根据其结果合理的去除或者exclude相关的子依赖。

自定义配置

loosejar提供了两个自定义配置,可以通过设置Java系统属性的方式去配置:

loosejar.format:这是一个非强制属性,可用于指定输出格式,目前支持csv或verbal 。此配置还影响通过JMX控制台提取的结果的输出格式。

示例:
verbal格式:

Jar: D:\maven\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar
Utilization: 10.71% - loaded 3 of 28 classes.

csv格式:

"jdk.internal.loader.ClassLoaders$AppClassLoader","D:\maven\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar","10.71%","3","28"

loosejar.outputFile:这是一个非强制属性,可用于将结果提取到文件中。如果未指定此选项,loosejar将结果打印到控制台(System.out)。此配置仅在应用程序关闭时应用。

注意:在使用IDEA关闭项目时点击一次stop即可,如果多次点击快速停止可能无法捕获信息。

【参考配置】
指定输出自定义文件并且指定输出格式为csv
jar包依赖分析工具,安全,开发工具和组件,DevOps,jar,maven,spring,依赖,安全

-javaagent:E:\test\loosejar-1.2.0.jar    -Dloosejar.outputFile=E:\test\demo.txt  -Dloosejar.format=csv 

小结

【1】上面的工具只是帮助我们分析了依赖,但是注意并不是说完全就可以确定对应的依赖可以直接剔除。在决定剔除之前和之后要有仔细的核对和检查,保证不会有影响。在之前的一次依赖排除中就遇到过某些poi相关的组件被排除了,启动时正常但是在运行特定功能时运行报错。还有一些网络通信的组件,这些往往都不是显示声明,对于这种运行时的组件一定要做好测试。
【2】在上面分析之后,可以通过mvn dependency:tree或者IDEA的maven依赖插件Maven Helper去分析下对应的依赖情况,做下核对检查。
【3】使用loosejar这种运行时跟踪检测的工具相对来说比其他静态分析的工具分析的结果要更加精确也更加全面。
【4】对于loosejar更适合将它集成到日常的开发中或者集成到研发测试环境,在运行过程中做好依赖信息的记录,并在运行一段时间后进行依赖的对比分析,根据分析结果选择性的排除一些不需要的依赖信息。文章来源地址https://www.toymoban.com/news/detail-557291.html

到了这里,关于如何定位不需要的Jar依赖 loosejar工具和maven工具实践分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring本地jar包依赖项目改为maven依赖

    我们在做项目的时候,可能会偶尔接手较为古老的项目,这些项目使用了较为老旧的版本管理或依赖管理方法,对于新开发项目来说,这些老旧的依赖管理方式会影响开发效率,所以,一般我们会选择将老项目的依赖管理修改为maven方式,简化依赖管理与测试打包等步骤 传统

    2024年02月06日
    浏览(61)
  • Maven 配置本地jar,通过下载第三方jar包,然后手动配置maven jar包依赖 例如:IKExpression

    说明:有时候有一些jar包 maven中央仓库和阿里云仓库没有收录的jar包需要手动下载至本地进行手动添加maven依赖,就拿 IK表达式 IKExpression jar 包来说 第一步 下载IKExpression 包 没有这个包的同学可以点击下载阿里云盘分享   第二步 找到自己项目本地maven仓库位置,如果不清楚可

    2024年02月12日
    浏览(49)
  • 【Maven】依赖管理—导入jar包的三种方式、依赖范围设置

    一、使用坐标导入 jar 包  二、使用坐标导入 jar 包 – 快捷方式  三、使用坐标导入 jar 包 – 自动导入  四、依赖范围 1、在 pom.xml 中编写 dependencies 标签 2、在 dependencies 标签中 使用 dependency 引入坐标 3、定义坐标的 groupId,artifactId,version 4、点击刷新按钮,使坐标生效 1、

    2024年02月16日
    浏览(55)
  • maven依赖jar包时版本冲突的解决

    在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。 直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。 传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解

    2024年02月03日
    浏览(65)
  • maven打包所有依赖,对外提供sdk.jar

    maven打包所有依赖 如何让引入自己sdk的spring扫描sdk下的类 新建配置类(@Import注解可以加载指定类至spring容器中) 新建如下目录以及文件  

    2024年02月11日
    浏览(37)
  • SpringBoot工程Maven构建引用本地jar包依赖

    目前大部分项目使用了SpringBoot,在项目实施过程中可能遇到没有搭建私有仓库,并且需要引入第三方提供的jar包(例如某些SDK)的情况。一般遇到以上情况可以将第三方提供的jar包通过以下命令安装到本地仓库,然后本地进行构建打包。 但是实际场景经常需要通过自动部署

    2024年01月24日
    浏览(49)
  • 【Java——maven的使用与idea创建maven项目,导入maven依赖(jar包)】

    1.1、打开maven安装路径下的conf文件夹,找到里面的settings.xml文件,(如果使用的是maven安装程序安装的maven,则settings.xml文件和本地仓库位置在默认位置:C:Userspenglei.m2)将下面的代码复制里面,切记不要放到注释里面 1.2、maven项目全局默认配置jdk版本信息,将下面的代码复制

    2024年02月08日
    浏览(90)
  • spring boot maven 手动打入外部jar包依赖

    有时候拿到第三方sdk是,以前都放在项目的某个目录下,然后通过项目路径去引入非常麻烦,最近找到了一个方法,可以手动将外部的jar包导入到本地的maven仓库中,这样你就可以像其他依赖一样正常使用了。 命令如下 Windows系统举例: 1、在你的jar包路径下,cmd打开dos黑窗口

    2024年02月16日
    浏览(44)
  • 将本地jar包手动添加到Maven仓库依赖处理

    在日常开发中,经常会遇到一些情况,就是在更新Maven时,从网上下载jar包的时候网络不稳定或者其他原因导致jar包数据缺失而导致的依赖无法正常引入的情况. 还有一些其他情况如个人jar包一类的。 以前以上这些情况,通常我是将本地jar包复制到Maven仓库根据目录结构替换相

    2024年02月09日
    浏览(46)
  • IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖)

    然后就可以使用我们自己构建lib目录中的jar包,开发项目啦

    2024年02月11日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包