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. entfrm开源免费模块化无代码开发平台,开放生态为您创造更多的价值

    entfrm开发平台6大特性,赋能快速开发,为您创造更多的价值: 1. 模块化 丰富的模块稳定的框架 后台极易上手 目前已包括系统管理.任务调度.运维监控.开发工具.消息系统.工作流引擎.内容管理等模 ...

  2. 编译安装nginx 1.16

    准备源码包,并解压,创建nginx用户 [root@slave-master ~]# tar xf nginx-1.16.0.tar.gz [root@slave-master ~]# useradd ...

  3. linux网络相关命令之脚本和centos启动流程

    nice 功用:设置优先权,可以改变程序执行的优先权等级.等级的范围从-19(最高优先级)到20(最低优先级).优先级为操作系统决定cpu分配的参数,优先级越高,所可能获得的 cpu时间越长. 语法: ...

  4. 远程连接mysql库问题

    如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...

  5. linux 磁盘满了,vim 编辑文件时无法保存

    早上来发现 redis 不能用,报 MISCONF Redis is configured to save RDB snapshots, but it is currently not able to ...

  6. Markdown随时记录

    Markdown学习 推荐文本编译器 Typora 标题(支持六级) 一级标题:# + 空格 + 内容 二级标题:## + 空格 + 内容 三级标题:### + 空格 + 内容 . . . 字体 粗体 ...

  7. 『学了就忘』Linux系统管理 — 82、Linux中进程的查看(ps命令)

    目录 1.ps命令介绍 2.ps aux命令示例 3.ps -le命令示例 4.pstree命令 1.ps命令介绍 ps命令是用来静态显示系统中进程的命令. 不过这个命令有些特殊,它部分命令的选项前不 ...

  8. android jni-dlerror报undefined symbol: JNI_OnLoad

    以下是很简单的一个官方的jni方法,在MainActivity的onCreate中调用 extern "C" JNIEXPORT jstring JNICALL Java_com_ ...

  9. EhCache简单入门

    一 介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通 ...

  10. LuoguP7071 [CSP-J2020] 优秀的拆分 题解

    Content 给定一个数 \(n\),求是否能够拆分成 \(2\) 的正整数次幂的和的形式,并给出具体方案. 数据范围:\(1\leqslant n\leqslant 10^7\). Solutio ...