首页 > 其他分享 >无用代码扫描组件设计

无用代码扫描组件设计

时间:2024-04-10 12:23:28浏览次数:24  
标签:dumpTask jar 无用 扫描 jacoco coverage 组件 代码

1、现状痛点

系统越来越臃肿,开发过程中可能产生的无用代码增加了系统维护成本。

2、设计思路

2.1、静态代码扫描方案

本方案解决静态代码下无调用方法扫描,通过ASTParser对静态文件进行扫描分析,获取代码块来判断调用关系。

基本步骤及思路

(1)载入本地磁盘项目

(2)循环使用ASTParser解析每个java文件的方法块,把类名+方法名和方法代码块一起落缓存,vm文件单独落。

分析代码如下

 


 

(3)进行调用关系扫描,再次用ASTParser解析解析每个java文件的方法块,拿方法名去缓存中根据代码块模糊查询,刨除掉自己之后统计调用次数,次数为0的可以认为是僵尸方法,打印出来供参考。

 

2.2、运行时扫描方案

本方案是借助jacoco(Java Code Coverage),jacoco本质是一种测试覆盖率工具,通过asn字节码增强技术再源代码中加入探针从而获取代码覆盖率

具体实践

(1)依赖jacoco.ant

在工程内的pom中引入jar依赖

<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.ant</artifactId>
    <version>0.8.3</version>
</dependency>
<dependency>
     <groupId>org.apache.ant</groupId>
     <artifactId>ant</artifactId>
     <version>1.9.9</version>
 </dependency>

(2)赋能Rest请求

添加一个url地址,通过ant执行dump task用于Dump Coverage文件生成

@RestController
@RequestMapping("/coverage")
public class CoverageController {

    @PostMapping("dump")
    @NoCheckMenuPermission
    public Result<Boolean> dumpCoverageFile() {
        DumpTask dumpTask = new DumpTask();
        // dump文件地址
        dumpTask.setDestfile(new File("/export/Data/coverage/code-cover.exec"));
        // 多次dump追加形式
        dumpTask.setAppend(true);
        // 选一个空闲接口即可
        dumpTask.setPort(8840);
        // 默认本机
        dumpTask.setAddress("127.0.0.1");
        dumpTask.execute();
        return Result.succeed(true);
    }
}

(3)嵌入jacocoagent

java启动参数添加如下:

#decompress file 解压依赖,获得jacocoagent.jar包,避免需要联系运维上传包
jar -xvf $BASEDIR/lib/org.jacoco.agent-0.8.3.jar

 

-javaagent:$BASEDIR/bin/jacocoagent.jar=includes=com.jdwl.*,output=tcpserver,port=8840,address=127.0.0.1 -Xverify:none

(4)增加配置脚本

/home/admin/clean_export.sh(脚本默认内容上增加了 && $9 != "coverage"

输出的文件路径为/export/Data/coverage/code-cover.exec

(5)下载cover文件

/export/Data/coverage/code-cover.exec目录下

(6)分析代码

打开idea -> run -> show coverage data选择对应的exec文件即可获取服务端的代码覆盖情况。

 

绿色覆盖(活跃代码)

 


 

红色未覆盖(僵尸代码)

 


 

 

(7)相关链接

1.JaCoCo - Documentatio 2.javaagent使用指南 - rickiyang - 博客园 (cnblogs.com 3.使用Jacoco统计服务端代码覆盖情况实践 - M104 - 博客园 (cnblogs.com 4.Diving Into Bytecode Manipulation: Creating an Audit Log With ASM and Javassist | New Reli

3、实现结果

1、启动工具,选择工程路径

 


 

2、点击生成DB,解析代码载入数据库

 


 

 


 

3、点击扫描,获取结果

 

 

标签:dumpTask,jar,无用,扫描,jacoco,coverage,组件,代码
From: https://www.cnblogs.com/Jcloud/p/18125765

相关文章

  • antd popover组件二次封装children显示
    importReact,{PropsWithChildren}from'react';import'./index.scss';import{Popover}from'antd';exportinterfaceDictPopoverCompProps{open:boolean;keyWords:string;}//词库联想气泡constDictPopoverComp=(prop......
  • ETL中Python组件的运用
    Python是一种高级、通用、解释型编程语言,以简洁、易读、易学的语法而闻名,被广泛应用于Web开发、数据科学、人工智能、自动化脚本等领域。 python的特点包含易读易学:Python的语法设计简洁清晰,类似英语,使得代码易读易懂,降低了学习门槛。动态类型:Python是一种动态类型语言,不需......
  • Vue3 给组件设置name
    在Vue3的<scriptsetup>模式下,往往会忽略name;但是在keep-alive等情况下又需要用到!方法1:<scriptlang="ts">exportdefault{name:"my-component"}</script><scriptlang="ts"setup>/*业务代码*/</script>方法......
  • Dapr(四) Dapr核心组件的使用二
    结合前三期 Dapr(一)基于云原生了解Dapr(Dapr(一)基于云原生了解Dapr-CSDN博客) Dapr(二)分布式应用运行时搭建及服务调用(Dapr(二)分布式应用运行时搭建及服务调用-CSDN博客) Dapr(三)Dapr核心组件的使用一(Dapr(三)Dapr核心组件的使用一-CSDN博客)。1.0使用外部......
  • 鸿蒙HarmonyOS实战-ArkUI组件(Video)
    ......
  • vue父组件调用子组件的方法,获取同步(实时)的返回结果
    vue父组件调用子组件的方法,获取同步(实时)的返回结果//父组件<template><Childref="childRef"></template><script>importChildfrom'.Child.vue'components:{Child,}setup(props,ctx){constchildRef=ref()//调用子组件的方法constgetC......
  • 前端【打包相关的配置项】【项目打包后本地查看配置】【去掉打包后js的map文件】【生
    1、打包后会生成dist目录,里面的index.html双击打开是空白的,需要部署到服务器上才能看到项目内容,此时可以通过vue.config.js中配置一个参数,这样本地打包完就可以看到效果vue.config.js1const{defineConfig}=require('@vue/cli-service')2module.exports=defineCon......
  • 开发Element-UI的Table 组件列显示隐藏,列表数据勾选批量导出/全量导出,显示导出进度并
    #用法<TabColDisplay:total="total"api-url="hgp/order"api-name="hgpLocalList":s-param="listQuery":select-ids="selIds"title="快速......
  • 在Linux中,什么是端口扫描?如何使用工具如nmap进行端口扫描?
    在Linux中,端口扫描是一种网络诊断和安全审计技术,通过该技术可以发现远程或本地主机上运行的服务及其所使用的网络端口的状态。端口扫描器发送特定类型的网络数据包到目标主机的不同端口号,根据返回的响应判断端口是否开放、关闭或被防火墙屏蔽。端口扫描可以帮助系统管理员检查自......
  • 界面组件DevExpress WinForms v23.2 - 功能区、富文本编辑器功能升级
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForms控件日前正式发布了v23.2,此版......