冗余jar包识别神器 - loose.jar

场景描述

项目迭代久了,会添加各类jar包,事实上很多jar包其实根本没用到。那如何快速识别冗余的jar,以方便从项目中清除掉呢?

比如:

该简单的测试工程lib里有63个jar包,如何扫描出真正使用到的jar包?

操作步骤

1) install后,命令行运行该程序,确保运行正常

D:\Insight\InsightWhys\target>java -jar InsightWhys-1.0.jar Main_MultiTask
2017-09-02 19:37:25:930
Main_MultiTask Done......
消耗177802开始: 2017-09-02 19:37:26:001
对于token:1000000156301_token已经消耗过

2) 放置loosejar.jar

3) agent启动跑程序

D:\Insight\InsightWhys\target>java -javaagent:loosejar-1.0.1.jar -jar InsightWhys-1.0.jar Main_MultiTask
[loosejar]: loosejar analysis is registered to run on JVM shutdown.
[loosejar]: Registering loosejar as a JMX service...
[loosejar]: Registered loosejar as a JMX service: [com.googlecode.loosejar:type=LooseJarMBean]
Main_MultiTask Done......
消耗156301开始: 2017-07-07 11:34:59:248
对于token:1000000156301_token已经消耗过
[loosejar]: Found 2014 classes loaded in the JVM.
[loosejar]: Found 122 various ClassLoader(s) inside the JVM.
[loosejar]: Summary for [sun.misc.Launcher$AppClassLoader] classloader:
Jar: D:\Insight\InsightWhys\target\TcThriftClient-1.0-SNAPSHOT.jar
Utilization: 2.51% - loaded 15 of 597 classes.
Jar: D:\Insight\InsightWhys\target\lib\libthrift-0.5.0.jar
Utilization: 22.94% - loaded 25 of 109 classes.
Jar: D:\Insight\InsightWhys\target\lib\finagle-core_2.10-6.20.0.jar
Utilization: 0.00% - loaded 0 of 1843 classes.
Jar: D:\Insight\InsightWhys\target\lib\scala-library-2.10.4.jar
Utilization: 0.00% - loaded 0 of 4899 classes.
Jar: D:\Insight\InsightWhys\target\lib\netty-3.9.1.1.Final.jar
Utilization: 0.00% - loaded 0 of 833 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-app_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 87 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-core_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 911 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-collection_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 34 classes.
Jar: D:\Insight\InsightWhys\target\lib\jsr305-1.3.9.jar
Utilization: 0.00% - loaded 0 of 35 classes.
Jar: D:\Insight\InsightWhys\target\lib\commons-collections-3.2.1.jar
Utilization: 0.00% - loaded 0 of 458 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-hashing_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 40 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-jvm_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 130 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-logging_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 141 classes.
Jar: D:\Insight\InsightWhys\target\lib\scalatest_2.10-2.1.3.jar
Utilization: 0.00% - loaded 0 of 3929 classes.
Jar: D:\Insight\InsightWhys\target\lib\scala-reflect-2.10.3.jar
Utilization: 0.00% - loaded 0 of 2036 classes.
Jar: D:\Insight\InsightWhys\target\lib\finagle-thrift_2.10-6.20.0.jar
Utilization: 0.00% - loaded 0 of 209 classes.
Jar: D:\Insight\InsightWhys\target\lib\finagle-serversets_2.10-6.20.0.jar
Utilization: 0.00% - loaded 0 of 464 classes.
Jar: D:\Insight\InsightWhys\target\lib\commons-lang-2.6.jar
Utilization: 0.00% - loaded 0 of 133 classes.
Jar: D:\Insight\InsightWhys\target\lib\commons-io-2.1.jar
Utilization: 0.00% - loaded 0 of 104 classes.
Jar: D:\Insight\InsightWhys\target\lib\slf4j-api-1.6.1.jar
Utilization: 39.13% - loaded 9 of 23 classes.
Jar: D:\Insight\InsightWhys\target\lib\slf4j-jdk14-1.6.1.jar
Utilization: 60.00% - loaded 3 of 5 classes.
Jar: D:\Insight\InsightWhys\target\lib\guice-3.0.jar
Utilization: 0.00% - loaded 0 of 565 classes.
Jar: D:\Insight\InsightWhys\target\lib\aopalliance-1.0.jar
Utilization: 0.00% - loaded 0 of 9 classes.
Jar: D:\Insight\InsightWhys\target\lib\gson-2.2.4.jar
Utilization: 0.00% - loaded 0 of 153 classes.
Jar: D:\Insight\InsightWhys\target\lib\zookeeper-3.3.4.jar
Utilization: 0.00% - loaded 0 of 341 classes.
Jar: D:\Insight\InsightWhys\target\lib\log4j-1.2.15.jar
Utilization: 0.00% - loaded 0 of 259 classes.
Jar: D:\Insight\InsightWhys\target\lib\finagle-test_2.10-6.20.0.jar
Utilization: 0.00% - loaded 0 of 11 classes.
Jar: D:\Insight\InsightWhys\target\lib\commons-codec-1.6.jar
Utilization: 0.00% - loaded 0 of 76 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-zk-common_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 27 classes.
Jar: D:\Insight\InsightWhys\target\lib\util-zk_2.10-6.19.0.jar
Utilization: 0.00% - loaded 0 of 217 classes.
Jar: D:\Insight\InsightWhys\target\lib\guava-16.0.1.jar
Utilization: 0.00% - loaded 0 of 1678 classes.
Jar: D:\Insight\InsightWhys\target\lib\jackson-core-2.3.1.jar
Utilization: 0.00% - loaded 0 of 87 classes.
Jar: D:\Insight\InsightWhys\target\lib\jackson-databind-2.3.1.jar
Utilization: 0.00% - loaded 0 of 565 classes.
Jar: D:\Insight\InsightWhys\target\lib\jackson-annotations-2.3.0.jar
Utilization: 0.00% - loaded 0 of 49 classes.
Jar: D:\Insight\InsightWhys\target\lib\jackson-module-scala_2.10-2.3.1.jar
Utilization: 0.00% - loaded 0 of 404 classes.
Jar: D:\Insight\InsightWhys\target\lib\paranamer-2.6.jar
Utilization: 0.00% - loaded 0 of 20 classes.

4) 用jconsole查看使用到的jar(该步骤可以省略,日志已在第3步打印了)





5) 统计出实际使用到36个jar

aopalliance-1.0.jar
commons-codec-1.6.jar
commons-collections-3.2.1.jar
commons-io-2.1.jar
commons-lang-2.6.jar
finagle-core_2.10-6.20.0.jar
finagle-serversets_2.10-6.20.0.jar
finagle-test_2.10-6.20.0.jar
finagle-thrift_2.10-6.20.0.jar
gson-2.2.4.jar
guava-16.0.1.jar
guice-3.0.jar
jackson-annotations-2.3.0.jar
jackson-core-2.3.1.jar
jackson-databind-2.3.1.jar
jackson-module-scala_2.10-2.3.1.jar
jsr305-1.3.9.jar
libthrift-0.5.0.jar
log4j-1.2.15.jar
netty-3.9.1.1.Final.jar
paranamer-2.6.jar
scala-library-2.10.4.jar
scala-reflect-2.10.3.jar
scalatest_2.10-2.1.3.jar
slf4j-api-1.6.1.jar
slf4j-jdk14-1.6.1.jar
util-app_2.10-6.19.0.jar
util-collection_2.10-6.19.0.jar
util-core_2.10-6.19.0.jar
util-hashing_2.10-6.19.0.jar
util-jvm_2.10-6.19.0.jar
util-logging_2.10-6.19.0.jar
util-zk-common_2.10-6.19.0.jar
util-zk_2.10-6.19.0.jar
zookeeper-3.3.4.jar
InsightWhys-1.0.jar

6) 回归验证,任意删除lib里这36个jar之外的jar,跑程序,正常

总结

该方法可以快速知道程序实际依赖的jar,虽然其他jar在不同case下可能会依赖,但可以有目的去人工校验或case覆盖,结合IDEA show dependencies来用更佳![]

冗余jar包识别神器 - loose.jar的更多相关文章

  1. Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发

    目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ...

  2. 多个jar包合并成一个jar包的办法

    步骤: 1.将多个JAR包使用压缩软件打开,并将全包名的类拷贝到一个临时目录地下. 2.cmd命令到该临时目录下,此时会有很多.class文件,其中需要带完整包路径 3.执行 jar -cvfM te ...

  3. 有引用外部jar包时(J2SE)生成jar文件

    一.工程没有引用外部jar包时(J2SE) 选中工程---->右键,Export...--->Java--->选择JAR file--->next-->选择jar fil ...

  4. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  5. Ant打包可运行的Jar包(加入第三方jar包)

    本章介绍使用ant打包可运行的Jar包. 打包jar包最大的问题在于如何加入第三方jar包使得jar文件可以直接运行.以下用一个实例程序进行说明. 程序结构: 关键代码: package com.al ...

  6. 【Maven学习】Maven打包生成普通jar包、可运行jar包、包含所有依赖的jar包

    http://blog.csdn.net/u013177446/article/details/54134394 ******************************************* ...

  7. 配置Jar包及相关依赖Jar包的本地存放路径

    配置Jar包及相关依赖Jar包的本地存放路径 用 maven2 ,pom.xml中设置了依赖,会帮你下载所有依赖的.jar到 M2_REPO 指向的目录. M2_REPO是一个用来定义 maven 2 ...

  8. idea升级maven工程jar包版本和解决jar包冲突

    原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...

  9. 多个jar包合并成一个jar包(ant)

    https://blog.csdn.net/gzl003csdn/article/details/53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具. ...

随机推荐

  1. 短网址API

    http://tao.tf/open/ API简介 API允许第三方自由调用URL缩短,基于text/json/jsonp/js模式,支持post.get提交. 支持缩短网址: 淘宝网(*.taoba ...

  2. 第三方布局框架Neon初探

    github地址:https://github.com/mamaral/Neon 居中 设置 view 在 superview 的中心,调用 anchorInCenter()并设置view大小,相当于 ...

  3. CentOS7x64 防火墙配置

    Firewall开启常见端口命令: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=publi ...

  4. TortoiseGit的ssh key和Git的ssh key

    情景模拟: 你使用Git+TortoiseGit对项目进行版本控制,本地库(自己电脑建立的.git)与远程库(如GitLab上建立)通信需要使用ssh验证,你用git生成公钥并保存到了Gitlab上, ...

  5. 性能之ab简单使用

    ab是apache自带的性能测试工具,他所有关注的请求返回的状态码(2XX),不关心后续处理过程,所以测试时间很小,严重依赖CPU颗粒数 一.进入ab存放的目录执行./ab.其中/ab [option ...

  6. web项目部署到服务器中浏览器中显示乱码

    项目部署之后浏览器打开查看时页面乱码 这里可能需要修改一下tomcat配置文件,首先找到Tomcat的安装路径下的conf/server.xml文件,找到之后可以CTRL+F搜索如下的内容: < ...

  7. NOIP-接水问题

    题目描述 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n编号,i号同学 ...

  8. angular.lowercase()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Go语言基础之函数

    Go语言基础之函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于“一等公民”. 函数 ...

  10. 设置mysql InnoDB存储引擎下取消自动提交事务

    mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...