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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM