मैं दो .jar फ़ाइलों की तुलना कैसे करूँ? दोनों ने .class फ़ाइलों को संकलित किया है।
मैं विधि परिवर्तन, आदि के संदर्भ में अंतर चाहता हूं।
जवाबों:
JAPICC , नमूना उपयोग:
japi-compliance-checker OLD.jar NEW.jar
Log4j के लिए नमूना रिपोर्ट: http://abi-laboratory.pro/java/tracker/timeline/log4j/
PkgDiff , नमूना उपयोग:
pkgdiff OLD.jar NEW.jar
Args4j के लिए नमूना रिपोर्ट देखें ।
क्लिअर , नमूना उपयोग:
java -jar clirr-core-0.6-uber.jar -o OLD.jar -n NEW.jar
यदि आप IntellijIdea में दो फाइलों का चयन करते हैं और दबाते हैं Ctrl + D
तो यह आपको अंतर दिखाएगा। मैं अल्टीमेट का उपयोग करता हूं और यह नहीं जानता कि यह सामुदायिक संस्करण के साथ काम करेगा या नहीं ।
jar
फ़ाइल का नाम बदलने और उपयोग करने के बजाए सामग्री निकालने के लिए उपयोग कर सकता हूं pkunzip
।)
javap -c
इसे बायटेकोड पर रखने के लिए बदलें (विशेषकर यदि "विधि परिवर्तन द्वारा" ओपी का मतलब विधि के हस्ताक्षर में परिवर्तन है)।
diff
व्हेक से बाहर javap
या jad
उत्पादन के आईएनजी फेंक देंगे ।
मापदंडों के साथ जार कमांड का उपयोग करके प्रत्येक जार को अपनी निर्देशिका में निकालें। अर्थातjar xvf myjar.jar
प्रत्येक जार के लिए।
फिर, diff
दो निर्देशिकाओं की तुलना करने के लिए UNIX कमांड का उपयोग करें। यह निर्देशिका में अंतर दिखाएगा। आप उपयोग कर सकते हैंdiff -r dir1 dir2
दो पुनरावृत्ति का और प्रत्येक निर्देशिका (.xml, .properties, आदि) में पाठ फ़ाइलों में अंतर दिखा ।
यह भी दिखाएगा कि क्या बाइनरी क्लास फाइलें अलग हैं। वास्तव में वर्ग फ़ाइलों की तुलना करने के लिए आपको उन्हें दूसरों के द्वारा विघटित करना होगा।
यहाँ 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}
मैं इसे विंडोज के लिए जीआईटी का उपयोग करके विंडोज पर चला सकता हूं। बस एक कमांड प्रॉम्प्ट खोलें। बैश चलाएं और फिर वहां से स्क्रिप्ट निष्पादित करें।
diff -r ${EXT_DIR1} ${EXT_DIR2}
या ${DIFF} ${EXT_DIR1} ${EXT_DIR2}
(यदि आपके घोषित चर का पुन: उपयोग करें)। जो लोग साइबरविन पर हैं, उनके लिए स्क्रिप्ट ने लगभग दो चीजों को छोड़कर मेरे लिए काम किया है जिन्हें मैंने बदल दिया है: 1) मुझे जेड की बजाय बिल्ट-इन जावप का उपयोग करना था, क्योंकि मैं जद (एन्टरप) फ़ायरवॉल डाउनलोड नहीं कर सकता ... ); 2) के रूप में jar xf
शामिल नहीं है रास्तों को समझने की तरह /cygwin/c/rest/of/path
है जिसके द्वारा दिया जाता है pwd
cygwin में, मैं यह करने के लिए कन्वर्ट करने के लिए किया था c:/rest/of/path
: JAR_DIR=${PWD}
, JAR_DIR=${JAR_DIR#*/cygdrive/c}
,JAR_DIR="c:$JAR_DIR"
jad
? उस बाइनरी को PATH
foo/bar/toto.jar
) में हैं, तो आपको -p
mkdir कमांड में तर्क जोड़ने की जरूरत है
लिनक्स / साइगिन में एक आसान स्क्रिप्ट जिसका मैं कई बार उपयोग करता हूं:
#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
जार फ़ाइल को स्रोत कोड फ़ाइल में बदलने के लिए जावा डेकोम्पेलर का उपयोग करें और फिर WinMerge का उपयोग करें तुलना करने के लिए का ।
आपको स्रोत कोड के कॉपीराइट धारक से परामर्श करना चाहिए, यह देखने के लिए कि क्या ऐसा करना ठीक है।
जावा डिकंपाइलर का उपयोग करें और सभी .class फ़ाइलों को डिकंपाइल करें और प्रोजेक्ट संरचना के रूप में सभी फ़ाइलों को सहेजें।
फिर पिघल अलग दर्शक का उपयोग करें और फ़ोल्डर्स के रूप में तुलना करें ..
यहाँ पर नि: शुल्क उपकरण http://www.extradata.com/products/jarc/ है
कृपया प्रयास करें http://www.osjava.org/jardiff/ - उपकरण पुराना है और निर्भरता सूची बड़ी है। डॉक्स से, यह कोशिश करने लायक लगता है।