2008-09-25 2 views
17

यदि आपके क्लासपाथ में दो जार हैं जिसमें एक ही कक्षा के विभिन्न संस्करण हैं, तो क्लासपाथ ऑर्डर महत्वपूर्ण हो जाता है।क्या यह पता लगाने के लिए कोई उपकरण है कि क्लासपाथ में एकाधिक जार में एक ही कक्षा मौजूद है या नहीं?

मैं ऐसे टूल की तलाश में हूं जो किसी दिए गए क्लासपाथ या फ़ोल्डरों के सेट में ऐसे संभावित संघर्षों को पहचान और ध्वजांकित कर सके।

निश्चित रूप से एक स्क्रिप्ट है कि शुरू होता है:

classes=`mktemp` 
for i in `find . -name "*.jar"` 
do 
    echo "File: $i" > $classes 
    jar tf $i > $classes 
    ... 
done 
कुछ चालाक प्रकार के साथ

/uniq/diff/ग्रेप/awk बाद में क्षमता है, लेकिन किसी को भी किसी भी मौजूदा समाधान के जानता है कि अगर मैं सोच रहा था।

उत्तर

6

JBoss से Tattletale उपकरण एक और उम्मीदवार है:

+0

जारफिश भी कोशिश करें (मेरा दूसरा जवाब); मैंने इसे सफलतापूर्वक –

+0

यूप का उपयोग किया! या तो यह या http://stackoverflow.com/questions/135971/is-there-a-tool-to-discover-if-the-same-class-exists-in-multiple-jars-in-the-clas/4516827 # 4516827 चाल चलाना चाहिए! –

+0

क्या कोई उपकरण/तरीका है जो केवल उपयोग (आयातित) कक्षाओं को फ़िल्टर करता है? हमारे पास हमारे क्लासपाथ में बहुत से डुप्लिकेट कक्षाएं हैं जिनका वास्तव में उपयोग नहीं किया जाता है –

1
+0

ये दोनों जो चाहते हैं उसके विपरीत करते हैं: वे जार के एक सेट में एक दी गई कक्षा पाते हैं। मैं किसी दिए गए क्लासपाथ या जार के सेट में विरोधाभासी कक्षाएं खोजना चाहता हूं। –

+0

इसके विपरीत क्या है? वे सूचीबद्ध करते हैं कि कौन सी जेएआर एक दी गई कक्षा पाई जा सकती है, और यदि कई मैच हैं, तो वे उन्हें सभी सूचीबद्ध करते हैं - यह आपकी संघर्ष सूची है। – skaffman

+0

लेकिन मैं कई जार में दिखाई देने वाली कुछ कक्षाओं के हर उदाहरण को खोजना चाहता हूं। मुझे अपने क्लासस्पैट में प्रत्येक कक्षा के लिए जोज चलाने और डुप्लीकेट्स (सॉर्ट | यूनिक | डिफ) की तलाश करना होगा - प्रश्न में मेरे ब्रूट-फोर्स प्रस्ताव का एक धीमा संस्करण। –

4

मुझे लगता है कि यह बहुत कठिन अपने आप के लिए एक उपकरण लिखने के लिए नहीं होगा।

आप System.getProperty ("java.class.path") के साथ क्लासपाथ प्रविष्टियां प्राप्त कर सकते हैं;

और फिर वहां सूचीबद्ध जार, ज़िप या निर्देशिकाओं के माध्यम से चलें और कक्षाओं के बारे में सारी जानकारी एकत्र करें और उन लोगों को ढूंढें जो परेशानी पैदा कर सकते हैं।

इस कार्य में सबसे अधिक 1 या 2 दिन लगेंगे। फिर आप इस कक्षा को सीधे अपने आवेदन में लोड कर सकते हैं और एक रिपोर्ट तैयार कर सकते हैं।

संभवतः java.class.path प्रॉपर्टी सभी कक्षाओं को दिखाती है यदि आप जटिल कस्टम क्लास लोडिंग के साथ कुछ बुनियादी ढांचे में भाग लेते हैं (उदाहरण के लिए मैंने एक बार एक ऐप देखा जो एलडीएपी से कक्षाएं लोड करता है) लेकिन यह निश्चित रूप से सबसे अधिक काम करेगा मामलों में से।

एक उपकरण है जो आपको उपयोगी लगेगा, मैंने इसे कभी भी अपने स्वयं का उपयोग नहीं किया है, लेकिन इसे आज़माएं और हमें परिणाम बताएं।

http://www.jgoodies.com/freeware/jpathreport/features.html

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

आप इसका उपयोग कर सकते हैं और इसे संशोधित कर सकते हैं ताकि एक निर्देशिका को फिर से चलने के बजाय, कक्षा पथ पढ़ें और क्लास टाइम विशेषता की तुलना करें।

वहाँ एक आदेश वर्ग आप उपवर्ग यदि आवश्यक हो तो, मैं की -execute विकल्प में सोच रहा था कर सकते हैं "लगता है"

यह मेरा खुद का कोड, बस करने के लिए है, तो यह "उत्पादन के लिए तैयार" करने का इरादा नहीं था काम करो।

import java.io.*; 
import java.util.zip.*; 


public class ListZipContent{ 
    public static void main(String [] args) throws IOException { 
     System.out.println("start " + new java.util.Date()); 
     String pattern = args.length == 1 ? args[0] : "OracleDriver.class";// Guess which class I was looking for :) 
     File file = new File("."); 
     FileFilter fileFilter = new FileFilter(){ 
      public boolean accept(File file){ 
       return file.isDirectory() || file.getName().endsWith("jar"); 
      } 
     }; 
     Command command = new Command(pattern); 
     executeRecursively(command, file, fileFilter); 
     System.out.println("finish " + new java.util.Date()); 
    } 
    private static void executeRecursively(Command command, File dir , FileFilter filter) throws IOException { 
     if(!dir.isDirectory()){ 
      System.out.println("not a directory " + dir); 
      return; 
     } 
     for(File file : dir.listFiles(filter)){ 
      if(file.isDirectory()){ 
       executeRecursively(command,file , filter); 
      }else{ 
       command.executeOn(file); 
      } 
     } 
    } 
} 
class Command { 

    private String pattern; 
    public Command(String pattern){ 
     this.pattern = pattern; 
    } 

    public void executeOn(File file) throws IOException { 
     if(pattern == null) { 
      System.out.println("Pattern is null "); 
      return; 
     } 

     String fileName = file.getName(); 
     boolean jarNameAlreadyPrinted = false; 

     ZipInputStream zis = null; 
     try{ 
      zis = new ZipInputStream(new FileInputStream(file)); 

      ZipEntry ze; 
      while((ze = zis.getNextEntry()) != null) { 
       if(ze.getName().endsWith(pattern)){ 
        if(!jarNameAlreadyPrinted){ 
         System.out.println("Contents of: " + file.getCanonicalPath() ); 
         jarNameAlreadyPrinted = true; 
        } 
        System.out.println(" " + ze.getName()); 
       } 
       zis.closeEntry(); 
      } 
     }finally{ 
      if(zis != null) try { 
       zis.close(); 
      }catch(Throwable t){} 
     } 
    } 
} 

मुझे उम्मीद है कि इससे मदद मिलती है।

+2

आप 1 या 2 दिन क्यों खर्च करेंगे जब संभावित उपकरण हैं जो आपके लिए करेंगे? यदि आप 1 या 2 दिनों के लिए अपने प्रोजेक्ट पर सख्ती से काम नहीं कर रहे हैं तो यह बेहतर शौक होगा या आप कुछ गलत कर रहे हैं। – ArtB

+0

लिंक http://www.jgoodies.com/freeware/jpathreport/features.html मर चुका है। क्या आप इसे अपडेट कर सकते हैं? –

0

jarclassfinder एक और ग्रहण प्लगइन विकल्प

+0

उत्पाद का विवरण कहता है कि यह जावा आर्काइव (जेएआर) फाइलों को खोजने के लिए प्लग-इन उपयोगिता है जिसमें एक परियोजना के जावा बिल्ड पथ के लिए दी गई कक्षा है। " यह मेरी जरूरत के विपरीत है। मुझे यह जानने की ज़रूरत है कि क्या एक ही कक्षा दो जारों में है, न कि कौन सी जार एक दी गई कक्षा है। –

+1

यह पता लगाएगा कि एक दिया गया वर्ग कई जारों में है, लेकिन इसे कई जारों में कक्षाओं के सभी मामलों को नहीं मिलेगा। –

8

jarfish की तरह लग रहा है कि तुम क्या अपने "ड्यूप्स" कमांड के साथ करना चाहते हैं जाएगा।

+0

अच्छा! या तो यह या http://stackoverflow.com/questions/135971/is-there-a-tool-to-discover-if-the-same-class-exists-in-multiple-jars-in-the-clas/4523559 # 4523559 चाल चलाना चाहिए। –

+0

यह काम किया। मुझे नहीं लगता कि टैटललेट ने जार फ़ाइलों को बहुत अच्छी तरह से संभाला है। अगर ऐसा होता है, तो मुझे इसका पता नहीं लगा। –

0

आप डाउनलोड करने और सामान को स्थापित करने से नापसंद यदि आप के साथ जार संघर्ष खोजने के लिए इस एक पंक्ति आदेश का उपयोग कर सकते हैं "स्पॉट यदि एक वर्ग/पैकेज कई जार फ़ाइलों में स्थित है" मानक gnu उपकरण। यह प्राथमिक है लेकिन आप इसे विस्तारित कर सकते हैं जैसा आप करेंगे।

ls *.jar | xargs -n1 -iFILE unzip -l FILE | grep class | sed "s,.* ,," | tr "/" "." | sort | uniq -d | xargs -n1 -iCLASS grep -l CLASS *.jar | sort -u 

स्पष्टीकरण (यह अगर तुम जार की एक बहुत कुछ है थोड़ा धीमा चलाने के लिए है): यह सब जार में सभी फाइलों को सूचीबद्ध करता है, वर्ग फ़ाइलों के लिए greps, ड्यूप्स पाता है, तो greps मूल जार देखने के लिए कि वे कहाँ दिखाई दिए। इसे एक और जटिल लिपि के साथ और अधिक कुशल बनाया जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे