簡體   English   中英

獲取罐子的所有導入類

[英]Getting all imported classes for a jar

對於給定的jar,我想找出該jar使用的所有類(盡可能)。 由於我有很多罐子,因此我想使這一過程自動化。 到目前為止,我最好的主意是

  1. 反編譯jar(我沒有經驗,但是應該有命令行工具)。
  2. 尋找導入並解析它們。

但是我希望其他人以前做過這樣的事情,並就此給我建議。

使用專用工具可能是可靠地實現此目的的方法。

但是,這樣做的一種真正麻煩的方法是獲取JAR中所有.class文件的列表,將JAR放在類路徑中,並使用javap獲取對其他類的引用:

#!/usr/bin/env bash
javap -cp $1 -v \
   `zipinfo -1 $1 '*.class' | sed 's:/:.:g' | sed 's:\.class$::'` | \
   grep ' = Class' | sed 's:.*// ::' | sort | uniq

guava-19.0.jar上運行此guava-19.0.jar可得到以下效果

"[[B"
"[B"
"[[C"
"[C"
com/google/common/annotations/Beta
com/google/common/annotations/GwtCompatible
com/google/common/annotations/GwtIncompatible
com/google/common/annotations/VisibleForTesting
com/google/common/base/Absent
com/google/common/base/AbstractIterator
...............................................................
"[Lcom/google/common/util/concurrent/MoreExecutors$DirectExecutor;"
"[Lcom/google/common/util/concurrent/Service$State;"
"[Lcom/google/thirdparty/publicsuffix/PublicSuffixType;"
"[Ljava/io/File;"
"[[Ljava/lang/annotation/Annotation;"
"[Ljava/lang/annotation/Annotation;"
"[Ljava/lang/Class;"
"[Ljava/lang/Comparable;"
"[Ljava/lang/Enum;"
"[[Ljava/lang/Object;"
"[Ljava/lang/Object;"
"[Ljava/lang/reflect/Field;"
"[Ljava/lang/reflect/Method;"
"[Ljava/lang/reflect/Type;"
"[Ljava/lang/reflect/TypeVariable;"
"[Ljava/lang/StackTraceElement;"
"[Ljava/lang/String;"
"[Ljava/net/URL;"
"[Ljava/util/Iterator;"
"[Ljava/util/Map$Entry;"
"[[S"
"[S"
sun/misc/Unsafe
"[[Z"
"[Z"

您將需要更多的輸出格式,並且正如其他人指出的那樣,它將不會使用任何反射。

工作原理:

zipinfo -1 $1 '*.class'將打印$1中所有.class文件的名稱,這是所示腳本的參數。 sed更迭/ s到. 並刪除.class擴展名,以便最終獲得Java樣式的類名列表。 您可以更優雅地執行此操作,但它應該可以工作。

javap調用使用-cp將jar放在類路徑中,並傳遞所有類。 -v使它輸出大量信息,包括一些表示對類名稱的引用的條目。 grep保證我們只是看着那些中, sed刪除我們不感興趣,一些額外的信息。 sort | uniq sort | uniq確保我們不會多次打印任何類的名稱。 它需要更多的sed丁標准化的輸出格式。

一種簡單的方法是嘗試在不添加該jar的情況下編譯代碼。

嘗試編譯並查看編譯器錯誤是最快的方法。

但是請記住,也可以使用反射(例如,通過spring配置文件)在運行時加載類,並且在不使用jar的情況下編譯代碼不會通知您運行時的潛在錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM