Linux查找class类所在jar包
1.说明
写代码或者定位问题的时候,
经常发生只知道类名不知道其所在jar包的问题,
在Eclipse中可以使用Ctrl+Shift+T查找类,
但是如果类所在的jar包不在Build Path中,
则是找不到的。
另一种方法是到网上搜索或者专门的网站去查找,
但只能查找公共仓库上的类所在jar包,
如果是自己编写的私有的类就找不到了。
还有的人自己写代码去查找指定的类,
这些都是可以参考的方法。
本文介绍在Linux服务器上面,
使用Shell命令查找指定class类所在jar包的方法。
2.示例
下面以jdk1.8的lib包为例,
查找Integer.class类所在的jar包。
本文所有命令在如下目录执行:
/usr/java/jdk1.8.0_151/jre/lib
下面先介绍几个基本Shell的命令,
然后通过组合这些命令实现查找功能,
而且进一步做一些小的修改优化,
最后给出一个推荐的常用命令。
3.查看jar包
查看当前目录下的jar包,不包括子目录:
ls *.jar
查看当前目录下的所有jar包,会递归查找所有子目录:
find . -iname "*.jar"
4.查看jar包中的类名
jar -tf rt.jar
该命令会显示jar包中的内容列表,
但是不会把jar包解压到当前的目录中,
只是用来查看jar包中类名的,
所以不会有副作用。
5.找到Integer.class所在的jar包
5.1.使用ls命令版本1
ls *.jar | while read jarfile; do
echo "$jarfile"
jar -tf $jarfile | grep "Integer.class"
done
在Linux终端命令行输入如下命令,
然后直接回车即可:
[root@dap211-159 lib]# ls *.jar | while read jarfile; do
> echo "$jarfile"
> jar -tf $jarfile | grep "Integer.class"
> done
命令输出结果如下:
charsets.jar
deploy.jar
javaws.jar
jce.jar
jfr.jar
jfxswt.jar
jsse.jar
management-agent.jar
plugin.jar
resources.jar
rt.jar
com/sun/org/apache/bcel/internal/classfile/ConstantInteger.class
com/sun/xml/internal/bind/v2/runtime/reflect/PrimitiveArrayListerInteger.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/FieldAccessor_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/MethodAccessor_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/TransducedAccessor_field_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/TransducedAccessor_method_Integer.class
sun/java2d/xr/MutableInteger.class
java/math/SignedMutableBigInteger.class
java/math/MutableBigInteger.class
java/math/BigInteger.class
sun/misc/FDBigInteger.class
java/util/concurrent/atomic/AtomicInteger.class
java/lang/Integer.class
可以看到Integer.class上一条输出的jar包是rt.jar,
所以Integer.class是在rt.jar包中的。
5.2.使用ls命令版本2
上一个命令输出的结果太多,不方便查看,
修改为只有找到找到Integer.class类,
才打印其所在的jar包。
ls *.jar | while read jarfile; do
jar -tf $jarfile | grep "Integer.class"
if [ $? -eq 0 ]
then
echo "find class in jar : "$jarfile
fi
done
命令输出结果如下:
com/sun/org/apache/bcel/internal/classfile/ConstantInteger.class
com/sun/xml/internal/bind/v2/runtime/reflect/PrimitiveArrayListerInteger.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/FieldAccessor_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/MethodAccessor_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/TransducedAccessor_field_Integer.class
com/sun/xml/internal/bind/v2/runtime/reflect/opt/TransducedAccessor_method_Integer.class
sun/java2d/xr/MutableInteger.class
java/math/SignedMutableBigInteger.class
java/math/MutableBigInteger.class
java/math/BigInteger.class
sun/misc/FDBigInteger.class
java/util/concurrent/atomic/AtomicInteger.class
java/lang/Integer.class
find class in jar : rt.jar
5.3.使用ls命令版本3
上一个命令输出的结果还是有点多,
输出了其他包含Integer.class的类,
可以把grep条件改为/Integer.class,
如果我们知道Integer.class的类全限定名称,
可以把grep条件改为java/lang/Integer.class:
ls *.jar | while read jarfile; do
jar -tf $jarfile | grep "java/lang/Integer.class"
if [ $? -eq 0 ]
then
echo "find class in jar : "$jarfile
fi
done
命令输出结果如下:
java/lang/Integer.class
find class in jar : rt.jar
5.4.使用find命令版本
如果要查找的jar包不仅在当前目录下面,
而且在各个子目录下面,
自己并不清楚具体要在那个目录查找,
比如在Maven本地仓库,或者是自己安装的应用服务中查找,
这个时候就可以切换到家目录或者/目录下,
使用find命令在所有jar包中查找指定类:
find . -iname "*.jar" | while read jarfile; do
jar -tf $jarfile | grep "java/lang/Integer.class"
if [ $? -eq 0 ]
then
echo "find class in jar : "$jarfile
fi
done
命令输出结果同上。
大部分情况下使用这个命令就可以了。
6.找到Integer.class所在的jar包方法2
下面再提供一个结合awk和sh的方法:
find . -name "*.jar"| awk '{print "jar -tf "$1}'| sh -x | grep -i "/Integer.class"
命令输出结果如下:
+ jar -tf ./jfr.jar
+ jar -tf ./deploy.jar
+ jar -tf ./management-agent.jar
+ jar -tf ./javaws.jar
+ jar -tf ./plugin.jar
+ jar -tf ./charsets.jar
+ jar -tf ./rt.jar
java/lang/Integer.class
+ jar -tf ./resources.jar
+ jar -tf ./security/policy/limited/local_policy.jar
+ jar -tf ./security/policy/limited/US_export_policy.jar
+ jar -tf ./security/policy/unlimited/local_policy.jar
+ jar -tf ./security/policy/unlimited/US_export_policy.jar
+ jar -tf ./jsse.jar
+ jar -tf ./ext/sunec.jar
+ jar -tf ./ext/dnsns.jar
+ jar -tf ./ext/cldrdata.jar
+ jar -tf ./ext/jfxrt.jar
+ jar -tf ./ext/jaccess.jar
+ jar -tf ./ext/nashorn.jar
+ jar -tf ./ext/zipfs.jar
+ jar -tf ./ext/sunpkcs11.jar
+ jar -tf ./ext/localedata.jar
+ jar -tf ./ext/sunjce_provider.jar
+ jar -tf ./jce.jar
+ jar -tf ./jfxswt.jar
可以看到在查看rt.jar时找到了Integer.class类。
7.参考文章
Linux查找class类所在jar包的更多相关文章
- idea之快速查看类所在jar包
- 【BUG】websphere找不到类或jar包冲突
来自:http://liuwei1578.blog.163.com/blog/static/49580364200991572642653/ Jar包冲突问题是在大型Java软件开发中经常遇到的问题, ...
- Linux上java程序的jar包启动通用脚本(稳定用过)
Linux上java程序的jar包启动通用脚本如下: #! /bin/sh export LANG="zh_CN.GBK" SERVICE_NAME=` .sh` SCRIPT_N ...
- java动态载入指定的类或者jar包反射调用其方法
序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...
- Eclipse中将java类打成jar包形式运行
记录一次帮助小伙伴将java类打成jar包运行 1.创建java project项目 file > new > project > java project 随便起一个项目名称,fi ...
- Linux 查找安装包所在目录的常用方法
1. which命令查找出相关命令是否已经在搜索路径中: $which gcc //显示出GNC的C编译器安装在哪个目录 返回: /usr/bin/gcc 注意:如果which没有找到要找的命令,可以 ...
- 使用命令把类打成jar包
测试用类 public class Hello { public static void main(String[] args) { System.out.println("hello wo ...
- C#调用java类、jar包方法(转)
一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...
- C#调用java类、jar包方法
一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...
随机推荐
- Output of C++ Program | Set 3
Predict the output of below C++ programs. Question 1 1 #include<iostream> 2 using namespace st ...
- 【C/C++】string的长度
一般用 s.length() s.size() 两种 size也可以用于vector string和vector的区别 string输入直接cin vector一般类似压栈pushback 输入一般是 ...
- last显示出unknown用户
这问题是群里有朋友发了一张照片看到的: 出现问题第一时间当然是百度或者谷歌,结果还是查到了,原来是gdm作怪,也可以认为是bug 该用户由GDM创建(可能是由于错误).并不是真的有"未知&q ...
- 学习笔记--html篇(1)
html学习--1 href学习 href="javascript:void(0)" 阻止页面跳转类似于javascript:#,url无变化(死链接,返回undefined) h ...
- Java 中接口和抽象类的 7 大区别!
本文已收录<Java常见面试题>:https://gitee.com/mydb/interview Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象.封装.继承和 ...
- powerdesigner给列加上注释步骤
powerdesigner给列加上注释步骤如图:
- PHP伪协议-文件包含
lfi.php案例代码 <?php include $_GET['file']; ?> phar://.zip://.zlib:// 用于读取压缩文件,zip:// .phart:// ...
- Guava Retryer实现接口重试
前言 小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理: 这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续处理: 这个问题该如何解决呢 ...
- nim_duilib(16)之xml学习实战(GTAV加载窗口实现)
本文的目标 使用配置xml实现下面的结果 布局 整体采用水平布局,左边显示文字区域设置为垂直布局. lets go stage 1 创建一个空白窗体,并设置为半透明:同时,使得整个窗口可以移动,则 将 ...
- 【LeetCode】379. Design Phone Directory 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组 日期 题目地址:https://leetcode ...