2009-04-17 18 views
9

के लिए सभी सबफ़ोल्डर में सभी जेएआर फ़ाइलों को स्कैन करें हम एक वर्ग का पुराना संस्करण देख रहे हैं, हालांकि हमारे पास नवीनतम तैनाती थी। किसी एप्लिकेशन सर्वर के सभी सबफ़ोल्डर में सभी JAR फ़ाइलों को स्कैन करने के लिए, हम एक छोटी शेल स्क्रिप्ट कैसे लिखते हैं जो JARS फ़ाइलों के फ़ाइल नाम को प्रिंट करता है जिसमें यह विशिष्ट वर्ग पाया जाता है?जारस्केन, विशिष्ट वर्ग

उत्तर

16

कुछ की तरह:

find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done 

आपको लगता है कि लपेट कर सकते हैं इस तरह:

jarscan() { 
    pattern=$(echo $1 | tr . /) 
    find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done 
} 

और फिर jarscan org.jboss.Main वर्तमान निर्देशिका के नीचे पाया सभी जार फ़ाइलों में उस वर्ग के लिए खोज करेंगे

+3

'जार' के बजाय 'unzip -l' का उपयोग करके यह बहुत तेज़ हो गया। 'जार' ने 72 सेकंड बनाम 4 सेकेंड लिया जब 'unzip -l' –

+0

के साथ चलाया गया, मैं वास्तव में यह कहने के लिए यहां आया था। +1 –

+0

यदि मैं जानना चाहता हूं कि कौन सा जार एक निश्चित वर्ग पाया जा सकता है तो मैं आमतौर पर सीडी ~/.m2/भंडार की तरह कुछ करता हूं; grep -r -H "classname" *। – extraneon

1

अब इस प्रश्न का उत्तर देने के लिए यहां एक सरल खोल कमांड है जो हमारे लिए किया गया है।

for jarFile in $(
    ls -R | 
    awk ' 
     match($0, ".*:") { 
      folder=$0 
     } 
     ! match($0, ".*:") { 
      print folder$0 
     }' | 
     grep "\.jar" | 
     sed -e "s/:/\//g" 
); 
do 
    unzip -l $jarFile; 
done | 
awk ' 
    match($0, "Archive.*") { 
     jar=$0 
    } 
    ! match($0, "Archive.*") { 
     print jar" : "$0 
    }' | 
grep org.jboss.Main 
2

यदि आपको केवल परिणाम की आवश्यकता है तो आप agentransack http://www.mythicsoft.com/agentransack/ इंस्टॉल कर सकते हैं और एक टेक्स्ट टेक्स्ट खोज कर सकते हैं। Agentransack जार और ज़िप फ़ाइलों के अंदर भी खोज करता है।

1

साल पहले मैंने इस तरह के मुद्दों को हल करने के लिए उपयोगिता classfind लिखा था। अपने क्लासरपाथ को अपने .jar सेट पर इंगित करने के लिए सेट करें, और क्लासफाइंड आपको बताएगा कि कौन सा जार इसे एक विशेष श्रेणी मिलेगा।

example% classfind -c Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> org.w3c.dom.Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> javax.swing.text.Document 
4

नहीं सीधे अपने सवाल का जवाब देने, लेकिन शायद यह आपकी समस्या का समाधान होगा: आप स्थान (जैसे जार फ़ाइल) जिसमें से एक विशिष्ट वर्ग अपने कोड में एक सामान्य पंक्ति जोड़कर लोड किया गया था प्रिंट कर सकते हैं:

System.err.println(YourClass.class.getProtectionDomain().getCodeSource()); 

तब आप यह सुनिश्चित करेंगे कि यह कहां से आता है।

3

टूल JAR Explorer बहुत उपयोगी है।

यह दो पैनलों के साथ एक जीयूआई विंडो खोलता है। आप एक निर्देशिका चुन सकते हैं, टूल उस निर्देशिका में सभी जेएआर फाइलों को स्कैन करेगा, फिर आपको एक विशिष्ट श्रेणी की खोज करने दें। निचला पैनल तब सभी स्कैन किए गए जेएआर फाइलों में उस वर्ग के लिए हिट की सूची के साथ रोशनी करता है।

+0

इस उपकरण के लिए नया यूआरएल: https://github.com/javalite/jar-explorer – ipolevoy

1

आप जावा टूल JarScan पर भी एक नज़र डालना चाहते हैं।

कोई कक्षा के नाम और पैकेज द्वारा खोज सकता है।

कुल कमांडर उपलब्ध नहीं होने पर यह बहुत मदद करता है और केवल जावा को निष्पादित करने की अनुमति है।

1
#! /bin/sh 

path=$1 
segment=$2 

if [ -z "$path" ] || [ -z "$segment" ] 
then 
    echo "Usage: $0 <path> <segment>" 
    exit 
fi 

for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done; 
संबंधित मुद्दे