Bütün bir Jar dosyasını nasıl kodabilirim? [kapalı]


283

Herkes bir Jar dosyası yerine tek bir sınıf yerine tüm decompile edebilen ücretsiz bir decompiler biliyor mu? $ 1.class name $ 2.class name.class gibi alt sınıflarla ilgili bir sorunum var


127
İki şeyi daha hatırlayın: 1) Bir dekomplerden bahsetmek "planladığınız kullanımın ne olduğu hakkında hiçbir fikriniz olmamasına rağmen" sizden daha kutsal "ın ortaya çıkmasına ve motifleriniz hakkında değer yargısına neden olacaktır, bu yüzden kiminle konuştuğunuza dikkat edin. 2) Süslü JavaDecompiler, kodun mükemmel bir yorumunu sunacak, iyi düzenlenmiş ve okunması kolay - sadece yorumlar eksik. Değişken isimlerle uzun süredir kaybolmuş bir JAR dosyasını kurtarmak şaşırtıcı derecede iyi. Tabii ki kurum içi JAR dosyalarımızı gizlemiyoruz.
Andrew

Ayrıca yazıdaki açıklamalara bakınız . Java dekomperini seçin ve test edin .
dma_k

8
Birinin bir Bukkit eklentisi için nasıl bir şey başardığını incelemeye ihtiyaç duyduğumda bu konuyu çok kez durdurdum ... Bu yorum her zaman bir gülümseme ile beni terk ediyor. Keşke her durduğumda oylamayı kaldırabilseydim.
Jane Panda


Herhangi bir yazılım indirmek istemiyorsanız, basit çevrimiçi decompiler. javadecompilers.com
Nick Graham

Yanıtlar:


313

2009: JavaDecompiler bir kavanoz ile iyi bir iş yapabilir : 0.2.5'ten beri, JAR dosyalarındaki tüm dosyalar görüntülenir.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

Ayrıca "Java sınıfı dosyalarını nasıl" kodabilirim "sorusuna da bakın. .

JD-Eclipse, 2009 sonlarından bu yana değişmiş gibi görünmüyor (bkz. Değişiklikler ).
Bu nedenle, en son Eclipse (3.8, 4.2+) ile entegrasyonu sorunlu olabilir.

JD-Core aktif olarak korunur.

Her ikisi de (SO kullanıcısı) Emmanuel Dupuy'un fantastik çalışmasının sonucudur .


2018: belirtilen bir daha modern bir seçenek, yorumlardaki tarafından David Kennedy Araujo :

JetBrains / intellij-toplum / plugins / java-Decompiler / motor

Fernflower, Java için ve muhtemelen genel olarak yüksek seviyeli bir programlama dili için çalışan ilk analitik dekomserdir.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

Ayrıca bkz . IntelliJ IDEA ile çalışan bir komut için java dosyalarına intellij ideali nasıl ayrılır .


5
fyi, java decompiler windows, mac ve linux üzerinde çalışır.
yanokwa

4
@AlexS nice :) Sonraki adım: sürüm kontrolü ( stackoverflow.com/questions/59561/… ) Ve sonra Sürekli Entegrasyon ( stackoverflow.com/questions/130592/… )
VonC

3
Java Decompiler ile JAR dosyasını açabilir ve Dosya, Tüm Kaynakları Kaydet'e gidebilirsiniz. Tüm sınıf dosyalarını java dosyalarına kaydeder = D
Akira Yamamoto

2
Lütfen hata yaptığını da unutmayın. Üye değişkenli bir sınıf var ve bu kodun etkisini yok, bir işlev parametresine taşındı. Dikkat et, seni alacak.
CharlesW

1
JD iyi bir başlangıç ​​noktasıdır, ancak karmaşık kodu derlemede başarısız olur. İyi bir alternatif github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy

37

Her şeyden önce, tüm Java arşiv dosyalarının ( .jar/ .war/ vb ...) temelde sadece.zip birkaç manifest ve meta veri içeren süslü dosyalar olduğunu hatırlamakta fayda var.

İkincisi, bu sorunu çözmek için kişisel olarak bu sorunu tüm seviyelerde ele alan birkaç araç kullanıyorum:

  • Jad + Jadclipse ,.classdosyalarıayrıştırmak için IDE'de çalışırken
  • Favori sıkıştırma aracım olan WinRAR , yerel olarak Java arşivlerini destekliyor (yine ilk paragrafa bakın).
  • Karşılaştırmanın ötesinde , en sevdiğim diff aracı, doğru yapılandırıldığındajarsdahil olmak üzere herhangi bir arşiv dosyası arasında anında karşılaştırmalar yapabilir. Denemeye değer.

Yukarıda belirtilenlerin avantajı, çalışma ortamımı tıkayan başka bir harici alete ihtiyaç duymamamdır. Bu dosyalardan birinden ihtiyaç duyacağım her şey IDE'mde ele alınabilir veya diğer dosyalarla doğal olarak farklılaştırılabilir.


lolz i chz ve firefox uzantıları unzipping tutmak ve ben .jar sadece fermuarlar olduğunu unuttum :)
Carter Cole

36

Hem bash kabuğuna hem de yeşim taşına sahipseniz:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

Bununla küçük, küçük bir bit olabilir, ancak reklamı az çok çalışmalıdır. $JAR.tmpSonuç olarak, decompiled dosyalarınızı içermelisiniz .


1
ubuntu üzerinde #! / bin / sh yerine #! / bin / bash kullanın becausw pushd varsayılan ubuntu kabuğu için çalışmıyor ...
mossplix

1
javapBu temel döngü yapısı içinde kullanıyorum ve bu benim için çalışıyor.
Chris Prince

25

(Sinir bozucu) " JD: Java Decompiler " adlı bir araç ile makul bir başarı elde ettim .

Java 5 ve üstü için derlenmiş sınıflarla uğraşırken çoğu dekomperi daha iyi buldum . Ne yazık ki, JAD'nin normal olarak başarılı olacağı bazı hıçkırıklar olabilir.


JD-GUI'nin Windows veya Linux sürümünü indiremedim. Bu sorun sadece bana mı geliyor?
mmdemirbas

@JanusTroelsen Sildim. Bildirdiğiniz için teşekkür ederiz. Cevapları temiz
tutalım

@ Zero3: güncellendi
Gowtham Gopalakrishnan

11

Gibi bir şey:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

olabilir?


1
Bir süre jad kullandım ve bütün bir kavanozun çıkarılması ve ayrıştırılması için hızlı bir yola ihtiyacım vardı. Teşekkürler, bu çok yardımcı oldu.
Alper Akture

5

Aşağıdakileri decompile.jar.sh dosyasına ekleyin

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // yürütülebilir
  • ln -s ./decomplie.jar.s / usr / bin / dj

Kullanıma hazır, sadece yazın dj your.jarve your.jar.srckaynaklarla klasör alacaksınız . -dHata ayıklama modu seçeneğini kullanın .


Teşekkürler, ama "jad" yerine "./jad" satır 23 değiştirmek ve bin klasörü
Sam

herhangi bir yeniden derleyici? jad dosyaları jar içine yeniden derler?
N Jay

2

Bir jar dosyası sadece jar uzantılı bir zip dosyasıdır. Bir kavanoz dosyasını bir zip dosyası gibi açabilmeniz (winzip) yapabilmeniz gerekir.


1

Çıkarın ve sonra direk karşı jad kullanın.


Direkt karşı koyabileceğini sanmıyorum. {Dir} / ** / *. Sınıf
Vihung

Kavanozu çıkarın ve jad {dir} gibi bir şey kullanın, sadece test ettim ve pencerelerde çalışmıyor
Jaime Hablutzel

1

Not: Bu çözüm yalnızca Mac ve * nix kullanıcıları için geçerlidir.

Ayrıca Jad'ı şanssız bulmaya çalıştım. Hızlı çözümüm, jad içeren MacJad'i indirmekti . İndirdikten sonra [nerede-indirdiğiniz-macjad] / MacJAD / İçindekiler / Kaynaklar / jad içinde jad bulabilirsiniz.

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.