İki .jar dosyasını karşılaştırma


96

İki .jar dosyasını nasıl karşılaştırırım? Her ikisi de .class dosyalarını derledi.

Yöntem değişikliği vb. Açısından farkı istiyorum.

Yanıtlar:


99

Andrey, bu aletler arasındaki fark nedir? Aynı çekirdekten mi kaynaklanıyorlar?
Nikolay Kuznetsov

3
@NikolayKuznetsov, hayır, bu araçların farklı çekirdeği var. pkgdiff - sınıf bildirimlerinin görsel karşılaştırması, japi-uygunluk-denetleyicisi ve clirr - değişikliklerin analizi (ilki perl, ikincisi - java'da yazılmıştır).
linuxbuild

TeamCity ile bir şey entegre etmeyi denediniz mi? Görünüşe göre clirr bir Maven Eklentisine sahip ve ayrıca JAPI-Checker adlı bir araç var.
Nikolay Kuznetsov

3
Lütfen hem Japi-Compliance-Checker hem de Pkgdiff'in her şeyi karşılaştırmadığını unutmayın. Örneğin, tüm yöntem uygulamaları göz ardı edilir. Rapor olarak yalnızca yöntem imzaları, yöntem kaldırmaları ve API uyumlulukları oluşturulur. İkili dosyaları karşılaştırmak üzereyseniz, diff veya cmp veya IntelliJ eklentisi veya hatta Karşılaştırmanın Ötesinde gibi araçları kullanmayı tercih edebilirsiniz!
Sriram

26

IntellijIdea'da iki dosya seçip tuşuna basarsanız, Ctrl + Dbu size farkı gösterecektir. Kullandığım Ultimate ve birlikte çalışacaktır bilmiyorum Topluluk baskısında.


1
@ChristianNilsson, Mac 10.14 Mojave'de 2018.2'de çalışıyor olsa da
xuesheng

Maven paketleyicisini seçme hatası yaptım. Harici Kitaplıklar altında , sarmalayıcıyı genişletmek ve ardından jar dosyasını seçmek gerekir. Teşekkürler @xuesheng
Christian Nilsson

Süper kolay çözüm.
xandermonkey

Şaşırtıcı aradığım
buydu

18
  1. .Jar'ı .zip olarak yeniden adlandırın
  2. Ayıkla
  3. İle decomple sınıf dosyaları JAD
  4. Özyinelemeli fark

2
Bu kaba kuvvet, ama aynen böyle yapıyorum. ( jarDosyayı yeniden adlandırıp kullanmak yerine içeriği çıkarmak için kullanabileceğim dışında pkunzip.)
David R Tribble

2
İsteğe bağlı olarak 3. adımı javap -cbayt kodunda tutmak için bir çağrı ile değiştirin (özellikle "yöntem değişiklikleri" ile OP, bir yöntemin imzasında değişiklik anlamına geliyorsa).
Mark Peters

Kaynak dosyada yukarı veya aşağı taşınan yöntem gövdeleri ile nasıl başa çıkarsınız? Bunu atmak düşünüyorum diffait ing javapveya jadvurmak dışına çıkışını.
Marcus Junius Brutus


5

Xvf parametreleriyle jar komutunu kullanarak her bir kavanozu kendi dizinine çıkarın. yani jar xvf myjar.jarher kavanoz için.

Ardından, diffiki dizini karşılaştırmak için UNIX komutunu kullanın. Bu, dizinlerdeki farklılıkları gösterecektir. diff -r dir1 dir2İki yineleme kullanabilir ve her dizindeki metin dosyalarındaki farklılıkları gösterebilirsiniz (.xml, .properties, vb.).

Bu ayrıca ikili sınıf dosyalarının farklı olup olmadığını da gösterecektir. Sınıf dosyalarını gerçekten karşılaştırmak için, onları başkaları tarafından belirtildiği gibi yeniden derlemeniz gerekir.


3

İşte sje397 tarafından açıklanan işlemi yapmak için betiğim:

    #!/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}

Windows için GIT kullanarak Windows'ta çalıştırabilirim. Sadece bir komut istemi açın. Bash'ı çalıştırın ve ardından betiği oradan çalıştırın.


2
Son satırı kaçırmışsınız gibi görünüyor: diff -r ${EXT_DIR1} ${EXT_DIR2}veya ${DIFF} ${EXT_DIR1} ${EXT_DIR2}(beyan edilen değişkeni yeniden kullanıyorsanız). Cygwin kullananlar için, değiştirdiğim iki şey dışında komut dosyası neredeyse benim için çalıştı: 1) jad (enterp. Firewall) indiremediğim için jad yerine yerleşik javap kullanmak zorunda kaldım. ); 2) olarak jar xfdoes't gibi yolları anlamaya /cygwin/c/rest/of/pathhangi döndürülen pwdcygwin içinde, ben dönüştürmek zorunda c:/rest/of/path: JAR_DIR=${PWD}, JAR_DIR=${JAR_DIR#*/cygdrive/c},JAR_DIR="c:$JAR_DIR"
Peter

Doğrusunuz @dpg. Son satır $ {DIFF} $ {EXT_DIR1} $ {EXT_DIR2} idi
skanga

Nedir jad? Bu ikilinin
Filip

Jad bir Java Kod Çözücüsüdür. Sanırım artık bakım yapılmıyor
skanga

Argümanlarınızın (jar dosyalarınızın) bir alt dizinde (gibi foo/bar/toto.jar) olması durumunda, -pmkdir komutuna argümanı eklemeniz gerekir
Duduche

2

Jar dosyasını kaynak kod dosyasına dönüştürmek için Java Decompiler'ı kullanın ve ardından karşılaştırma yapmak için WinMerge'i kullanın.

Bunu yapmanın uygun olup olmadığını görmek için kaynak kodun telif hakkı sahibine danışmalısınız.


2

Linux / CygWin'de bazen kullandığım kullanışlı bir betik:

#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

java decompiler'ı kullanın ve tüm .class dosyalarını derleyin ve tüm dosyaları proje yapısı olarak kaydedin.

ardından meld diff görüntüleyiciyi kullanın ve klasörler olarak karşılaştırın ..


0

Görünürde ücretsiz bir araç http://www.extradata.com/products/jarc/


Teşekkürler. Bunu denedim. Bu .jar birçok sınıfları varsa, okunabilir hale getirmek için gerekli olan XML ve fazla işlem çıkış üretir
Kunal

1
Bana göre kayıp bir tools.jar'dan şikayet etti. JDK kullanıyorum, bu yüzden sorun bu değil. Java7'yi desteklemediğini düşünüyorum.
Roel Spilker

@Tom bağlantı koptu, bu cevap kaldırılabilir.
David Dossot

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.