दो .jar फ़ाइलों की तुलना


93

मैं दो .jar फ़ाइलों की तुलना कैसे करूँ? दोनों ने .class फ़ाइलों को संकलित किया है।

मैं विधि परिवर्तन, आदि के संदर्भ में अंतर चाहता हूं।

जवाबों:


96

एंड्री, उन उपकरणों के बीच अंतर क्या है? क्या वे एक ही कोर से स्टेम करते हैं?
निकोले कुजनेत्सोव

3
@NikolayKuznetsov, नहीं, इन उपकरणों में अलग-अलग कोर हैं। pkgdiff - वर्गों की घोषणाओं की दृश्य तुलना, जापी-अनुपालन-चेकर और क्लिर - परिवर्तनों का विश्लेषण (पहला एक पर्ल में लिखा गया है, दूसरा - जावा में)।
linuxbuild

क्या आपने TeamCity के साथ कुछ एकीकृत करने की कोशिश की है? ऐसा लगता है कि क्लिर में मावेन प्लगिन है और जेएपीआई-चेकर नामक एक उपकरण भी है।
निकोले कुजनेत्सोव

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

23

यदि आप IntellijIdea में दो फाइलों का चयन करते हैं और दबाते हैं Ctrl + Dतो यह आपको अंतर दिखाएगा। मैं अल्टीमेट का उपयोग करता हूं और यह नहीं जानता कि यह सामुदायिक संस्करण के साथ काम करेगा या नहीं ।


1
@ क्रिसटन नीलसन, 2018.2 में मैक 10.14 पर काम करता है, हालांकि मोजावे
xuesheng

मैंने मावेन रैपर का चयन करने की गलती की। बाहरी पुस्तकालयों के तहत एक आवरण को विस्तारित करने की आवश्यकता होती है और फिर जार-फ़ाइल का चयन करें। धन्यवाद @xuesheng
क्रिश्चियन निल्सन

सुपर आसान उपाय।
xandermonkey

कमाल है कि मैं क्या देख रहा था :)
z1lV3r

18
  1. नाम बदलकर .jar .zip
  2. उद्धरण
  3. साथ डिकंपाइल वर्ग फ़ाइलों jad
  4. पुनरावर्ती भिन्न

2
यह क्रूर बल है, लेकिन यह ठीक उसी तरह है जैसे मैं करूँगा। (सिवाय इसके कि मैं jarफ़ाइल का नाम बदलने और उपयोग करने के बजाए सामग्री निकालने के लिए उपयोग कर सकता हूं pkunzip।)
डेविड आर ट्रिबबल

2
वैकल्पिक रूप से चरण 3 को कॉल करके javap -cइसे बायटेकोड पर रखने के लिए बदलें (विशेषकर यदि "विधि परिवर्तन द्वारा" ओपी का मतलब विधि के हस्ताक्षर में परिवर्तन है)।
मार्क पीटर्स

आप स्रोत फ़ाइल के ऊपर या नीचे ले जाने की विधि निकायों के साथ कैसे व्यवहार करेंगे? मुझे लगता है कि diffव्हेक से बाहर javapया jadउत्पादन के आईएनजी फेंक देंगे ।
मार्कस जुनियस ब्रूटस


5

मापदंडों के साथ जार कमांड का उपयोग करके प्रत्येक जार को अपनी निर्देशिका में निकालें। अर्थातjar xvf myjar.jar प्रत्येक जार के लिए।

फिर, diffदो निर्देशिकाओं की तुलना करने के लिए UNIX कमांड का उपयोग करें। यह निर्देशिका में अंतर दिखाएगा। आप उपयोग कर सकते हैंdiff -r dir1 dir2 दो पुनरावृत्ति का और प्रत्येक निर्देशिका (.xml, .properties, आदि) में पाठ फ़ाइलों में अंतर दिखा ।

यह भी दिखाएगा कि क्या बाइनरी क्लास फाइलें अलग हैं। वास्तव में वर्ग फ़ाइलों की तुलना करने के लिए आपको उन्हें दूसरों के द्वारा विघटित करना होगा।


3

यहाँ sje397 द्वारा वर्णित प्रक्रिया को करने के लिए मेरी स्क्रिप्ट है:

    #!/bin/sh

    # Needed if running on Windows
    FIND="/usr/bin/find"
    DIFF="diff -r"

    # Extract the jar (war or ear)
    JAR_FILE1=$1
    JAR_FILE2=$2

    JAR_DIR=${PWD}          # to assign to a variable
    TEMP_DIR=$(mktemp -d)

    echo "Extracting jars in $TEMP_DIR"

    EXT_DIR1="${TEMP_DIR}/${JAR_FILE1%.*}"
    EXT_DIR2="${TEMP_DIR}/${JAR_FILE2%.*}"

    mkdir ${EXT_DIR1}
    cd ${EXT_DIR1}
    jar xf ${JAR_DIR}/${JAR_FILE1}
    jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
    cd ..

    mkdir ${EXT_DIR2}
    cd ${EXT_DIR2}
    jar xf ${JAR_DIR}/${JAR_FILE2}
    jad -d . -o -t2 -safe -space -b -ff -s java -r **/*.class
    cd ..

    # remove class files so the diff is clean
    ${FIND} ${TEMP_DIR} -name '*.class' | xargs rm

    # diff recursively 
    ${DIFF} ${EXT_DIR1} ${EXT_DIR2}

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


2
लगता है कि आप अंतिम पंक्ति से चूक गए: diff -r ${EXT_DIR1} ${EXT_DIR2}या ${DIFF} ${EXT_DIR1} ${EXT_DIR2}(यदि आपके घोषित चर का पुन: उपयोग करें)। जो लोग साइबरविन पर हैं, उनके लिए स्क्रिप्ट ने लगभग दो चीजों को छोड़कर मेरे लिए काम किया है जिन्हें मैंने बदल दिया है: 1) मुझे जेड की बजाय बिल्ट-इन जावप का उपयोग करना था, क्योंकि मैं जद (एन्टरप) फ़ायरवॉल डाउनलोड नहीं कर सकता ... ); 2) के रूप में jar xfशामिल नहीं है रास्तों को समझने की तरह /cygwin/c/rest/of/pathहै जिसके द्वारा दिया जाता है pwdcygwin में, मैं यह करने के लिए कन्वर्ट करने के लिए किया था c:/rest/of/path: JAR_DIR=${PWD}, JAR_DIR=${JAR_DIR#*/cygdrive/c},JAR_DIR="c:$JAR_DIR"
PetroCliff

आप @dpg सही हैं। अंतिम पंक्ति $ {DIFF} $ {EXT_DIR1} $ {EXT_DIR2}
स्कंगा

क्या है jad? उस बाइनरी को PATH
Filip

Jad एक Java Decompiler है। मुझे लगता है कि अब इसे बनाए नहीं रखा गया है, लेकिन मैंने इसे javadecompilers.com/jad
skanga

यदि आपकी दलीलें (जार फाइलें) एक उपनिर्देशिका (जैसे foo/bar/toto.jar) में हैं, तो आपको -pmkdir कमांड में तर्क जोड़ने की जरूरत है
Duduche

2

लिनक्स / साइगिन में एक आसान स्क्रिप्ट जिसका मैं कई बार उपयोग करता हूं:

#Extract the jar (war or ear)
cd dir1
jar xvf jar-file1
for i in `ls *.class`
do
 javap $i > ${i}.txt #list the functions/variables etc
done

cd dir2
jar xvf jar-file2
for i in `ls *.class`
do
 javap $i > ${i}.txt #list the functions/variables etc
done

diff -r dir1 dir2 #diff recursively

1

जार फ़ाइल को स्रोत कोड फ़ाइल में बदलने के लिए जावा डेकोम्पेलर का उपयोग करें और फिर WinMerge का उपयोग करें तुलना करने के लिए का ।

आपको स्रोत कोड के कॉपीराइट धारक से परामर्श करना चाहिए, यह देखने के लिए कि क्या ऐसा करना ठीक है।


1

जावा डिकंपाइलर का उपयोग करें और सभी .class फ़ाइलों को डिकंपाइल करें और प्रोजेक्ट संरचना के रूप में सभी फ़ाइलों को सहेजें।

फिर पिघल अलग दर्शक का उपयोग करें और फ़ोल्डर्स के रूप में तुलना करें ..


0

यहाँ पर नि: शुल्क उपकरण http://www.extradata.com/products/jarc/ है


धन्यवाद। मैंने यह एक कोशिश की। यह XML और आगे की प्रक्रिया में उत्पादन का उत्पादन करता है, तो आप .jar में कई श्रेणियां होती हैं यह पठनीय बनाने के लिए आवश्यक है,
कुणाल

1
मेरे लिए यह एक लापता उपकरण के बारे में शिकायत की। मैं JDK का उपयोग करता हूं, इसलिए यह समस्या नहीं है। मुझे लगता है कि यह java7 का समर्थन नहीं करता है।
रोयल स्पिलकर

@ लिंक लिंक टूट गया है, इस जवाब को हटाया जा सकता है।
डेविड डॉसॉट

0

कृपया प्रयास करें http://www.osjava.org/jardiff/ - उपकरण पुराना है और निर्भरता सूची बड़ी है। डॉक्स से, यह कोशिश करने लायक लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.