冗余jar包识别神器 - loose.jar
冗余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的更多相关文章
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ...
- 多个jar包合并成一个jar包的办法
步骤: 1.将多个JAR包使用压缩软件打开,并将全包名的类拷贝到一个临时目录地下. 2.cmd命令到该临时目录下,此时会有很多.class文件,其中需要带完整包路径 3.执行 jar -cvfM te ...
- 有引用外部jar包时(J2SE)生成jar文件
一.工程没有引用外部jar包时(J2SE) 选中工程---->右键,Export...--->Java--->选择JAR file--->next-->选择jar fil ...
- spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途
Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...
- Ant打包可运行的Jar包(加入第三方jar包)
本章介绍使用ant打包可运行的Jar包. 打包jar包最大的问题在于如何加入第三方jar包使得jar文件可以直接运行.以下用一个实例程序进行说明. 程序结构: 关键代码: package com.al ...
- 【Maven学习】Maven打包生成普通jar包、可运行jar包、包含所有依赖的jar包
http://blog.csdn.net/u013177446/article/details/54134394 ******************************************* ...
- 配置Jar包及相关依赖Jar包的本地存放路径
配置Jar包及相关依赖Jar包的本地存放路径 用 maven2 ,pom.xml中设置了依赖,会帮你下载所有依赖的.jar到 M2_REPO 指向的目录. M2_REPO是一个用来定义 maven 2 ...
- idea升级maven工程jar包版本和解决jar包冲突
原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...
- 多个jar包合并成一个jar包(ant)
https://blog.csdn.net/gzl003csdn/article/details/53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具. ...
随机推荐
- BZOJ.5305.[HAOI2018]苹果树(组合 计数)
LOJ BZOJ 洛谷 BZOJ上除了0ms的Rank1啦.明明这题常数很好优化的. 首先,\(n=1\)时有\(2\)个位置放叶子,\(n=2\)时有\(3\)个... 可知\(n\)个点的有标号二 ...
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
- pta-树种统计
树种统计 (25 分) 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(≤105 ...
- NOIP-火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等 ...
- Java_集合
定义: 是一种工具,就像是容器,能存储任意数量的具有共同属性的对象. 与数组比较优点: (1)数组定义后长度不可变,集合长度可变: (2)数组只能通过下标访问,且下标类型只能是数字型,而有的集合(ma ...
- Vue 项目: npm run dev 报错 webpack-dev-server
从码云上下载vue项目,运行npm run dev 时报错: > webpack-dev-server --inline --progress --config build/webpack.de ...
- android 2018 面试题
四大组件:activity.service.content provider.broadcast receiver [一]Activity 1.生命周期 onCreate:表示activity正在被创 ...
- TCP协议学习总结(下)
在前两边TCP学习总结中,也大概地学习了TCP的整个流程,但许多细节中的细节并没有详细学习,例如超时重传问题,每次瓶颈回归慢启动效率问题以及最大窗口限制问题等.本学习篇章最要针对这些细节中的细节进行学 ...
- Egg 中 Controller 最佳实践
得益于 JavaScript 加入的 decorator 特性,可以使我们跟 Java/C# 一样,更加直观自然的,做面向切面编程.而随着 TypeScript 的成熟,类型系统也让我们增强了信心,面 ...
- NeuChar 平台使用及开发教程(三):使用 NeuChar 的菜单服务
上一篇<NeuChar 平台使用及开发教程(二):设置平台账号>我们已经完成了平台账号的设置,下面就马上来体验一下自定义菜单的设置吧! 进入某个 Neural Cell 的设置界面,在右侧 ...