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.参考文章

找到class 所在的jar
使用命令行快速找出class文件所在的jar文件

Linux查找class类所在jar包的更多相关文章

  1. idea之快速查看类所在jar包

  2. 【BUG】websphere找不到类或jar包冲突

    来自:http://liuwei1578.blog.163.com/blog/static/49580364200991572642653/ Jar包冲突问题是在大型Java软件开发中经常遇到的问题, ...

  3. Linux上java程序的jar包启动通用脚本(稳定用过)

    Linux上java程序的jar包启动通用脚本如下: #! /bin/sh export LANG="zh_CN.GBK" SERVICE_NAME=` .sh` SCRIPT_N ...

  4. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  5. Eclipse中将java类打成jar包形式运行

    记录一次帮助小伙伴将java类打成jar包运行 1.创建java project项目 file > new > project > java project 随便起一个项目名称,fi ...

  6. Linux 查找安装包所在目录的常用方法

    1. which命令查找出相关命令是否已经在搜索路径中: $which gcc //显示出GNC的C编译器安装在哪个目录 返回: /usr/bin/gcc 注意:如果which没有找到要找的命令,可以 ...

  7. 使用命令把类打成jar包

    测试用类 public class Hello { public static void main(String[] args) { System.out.println("hello wo ...

  8. C#调用java类、jar包方法(转)

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...

  9. C#调用java类、jar包方法

    一.将已经编译后的java中Class文件进行打包:打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理: 使用的命令:jar cvf test.jar -C com/ . 其中tes ...

随机推荐

  1. Android 高级UI组件(一)GridView与ListView

    1.GridView 1.GridView学习 GridView和ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选 main.xml: <?xml version ...

  2. RestTemplate的exchange()方法,解决put和delete请求拿不到返回值的问题

    嗷嗷待哺的controller(被调用provider的controller方法) //测试get少量参数 @RequestMapping(value = "detailsGetD" ...

  3. Vue API 3 (模板语法 ,指令)

    条件 v-if v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. v-show v-show 指令也是用于根据条件展示一块内容.v-show 只是 ...

  4. 分布式系统为什么不用自增id,要用雪花算法生成id???

    1.为什么数据库id自增和uuid不适合分布式id id自增:当数据量庞大时,在数据库分库分表后,数据库自增id不能满足唯一id来标识数据:因为每个表都按自己节奏自增,会造成id冲突,无法满足需求.  ...

  5. 如何将java对象转换成json数据

    package cn.hopetesting.com.test;import cn.hopetesting.com.domain.User;import com.fasterxml.jackson.c ...

  6. 使用buffered流结合byte数组,读入文件中的内容,包括中文字符

    package com.itcast.demo05.Buffered;import java.io.BufferedInputStream;import java.io.FileInputStream ...

  7. 3、Linux的Redis安装

    Linux下安装redis 1.Redis下载 [Redis官网下载地址](https://redis.io/download)    进入官网进行下载 wget https://download.r ...

  8. Samba 源码解析之内存管理

    由于工作需要想研究下Samba的源码,下载后发现目录结构还是很清晰的.一般大家可能会对source3和source4文件夹比较疑惑.这两个文件夹针对的是Samba主版本号,所以你可以暂时先看一个.这里 ...

  9. 从 CPython 源码角度看 Python 垃圾回收机制

    环状双向链表 refchain 在 Python 程序中创建的任何对象都会被放到 refchain 链表中,当创建一个 Python 对象时,内部实际上创建了一些基本的数据: 上一个对象 下一个对象 ...

  10. [BUUCTF]REVERSE——reverse3

    reverse3 附件 步骤: 例行查壳儿,32位程序,无壳儿 32位ida载入,shift+f12检索程序里的字符串,得到了有关flag的提示,而且看到了ABCDE--78这种字符串,猜测存在bas ...