How to decompile a whole Jar file? [closed]
Asked Answered
H

8

344

Does anyone know of a free decompiler that can decompile an entire Jar file instead of a single class? I have a problem with sub classes like name$1.class name$2.class name.class

Haroldharolda answered 15/3, 2009 at 2:8 Comment(7)
Remember two more things: 1) The mere mention of a decompiler will cause the "holier than thou's" to come out and make value judgements about your motives despite having no idea what your planned use is, so be careful who you talk to. 2) The fancy JavaDecompiler will give you an excellent rendition of the code, well laid out and easy to read - missing only comments. It is astoundingly good, recovering a JAR file which had long lost source complete with variable names. Of course we don't obfuscate our in-house JAR files.Spellbinder
See also remarks in post Choose and test java decompiler.Groff
I've stopped by this thread so many times when I needed to study how someone accomplished something for a Bukkit plugin... That comment always leaves me with a smile. I wish I could upvote it every time I stop by.Hilaire
Simple online decompiler if you don't want to download any software. javadecompilers.comPremeditate
This shouldn't be closed as the decompilers playground changes dynamically. Currently, the best is probably FernFlower. If you're looking for an easy solution, download Windup and run it's command-line version on your .jar. It will decompile using FernFlower, with support up to Java 8 (jad only suports up to Java 1.3, JavaDecompiler up to Java 1.5 IIRC), with a fallback to Procyon if FernFlower fails.Cloakroom
As of 2022, this one works well: jdec.appLulalulea
As of 2022, QuiltMC/quiltflower looks promising.Alderson
A
375

2023: splashout suggests in the comments the Vineflower/vineflower decompiler (releases), renaming from Quiltflower to Vineflower.

java -jar vineflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\souce

2022 update: QuiltMC/quiltflower is the latest most advanced Java decompiler:

Quiltflower is a modern, general purpose decompiler focused on improving code quality, speed, and usability.
Quiltflower is a fork of Fernflower and Forgeflower.

Changes include:

  • New language features (Try with resources, switch expressions, pattern matching, and more)
  • Better control flow generation (loops, try-catch, and switch, etc.)
  • More configurability
  • Better error messages
  • Javadoc application
  • Multithreading
  • Optimization
  • Many other miscellaneous features and fixes

Originally intended just for use with the QuiltMC toolchain with Minecraft, Quiltflower quickly expanded to be a general purpose java decompiler aiming to create code that is as accurate and clean as possible.

If the name sounds familiar it's because Quiltflower is a fork of Fernflower, the (in)famous decompiler that was developed by Stiver, maintained by Jetbrains, and became the default decompiler in Intellij IDEA.
Fernflower also quickly found its way into many other tools.

Over the past year, Quiltflower has added support for features such as modern string concatenation, a code formatter, sealed classes, pattern matching, switch expressions, try-with-resources, and more. Quiltflower also focuses on the code quality of the decompiled output, and takes readability very seriously.

See output examples.

Runs nice with jbang

https://github.com/QuiltMC/quiltflower/releases/download/1.8.1/quiltflower-1.8.1.jar

Or:

java -jar quiltflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

2009: JavaDecompiler can do a good job with a jar: since 0.2.5, All files, in JAR files, are displayed.

https://static.mcmap.net/file/mcmap/ZG-Ab5ovKRphcmEQXFyjaR0eZVYlbi2mbmylKmXw/sites/default/screenshots/screenshot1.png

See also the question "How do I “decompile” Java class files?".

The JD-Eclipse doesn't seem to have changed since late 2009 though (see Changes).
So its integration with latest Eclipse (3.8, 4.2+) might be problematic.

JD-Core is actively maintained.

Both are the result of the fantastic work of (SO user) Emmanuel Dupuy.


2018: A more modern option, mentioned in the comments by David Kennedy Araujo:

JetBrains/intellij-community/plugins/java-decompiler/engine

Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general.

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\

See also How to decompile to java files intellij idea for a command working with recent IntelliJ IDEA.


2022 update: Florian Wendelborn suggests in the comments

this one works well: jdec.app from Leonardo Santos.

Alderson answered 15/3, 2009 at 2:21 Comment(17)
fyi, java decompiler works on windows, mac and linux.Pothole
@AlexS nice :) Next step: version control (#60061) And then Continuous Integration (#131092)Alderson
Anyone get the eclipse plugin to work anymore with the latest eclipse and jdk7? I tried but I get a download error. JD-Gui works but jd-eclipse seems to fail for me...Strafford
@StephaneGrenier I didn't test it recently. That could be a question in its own (detailed with the OS, Eclipse version, and screenshot of the error message you got, or the Eclipse log view). Java-Decompiler maintainer Emmanuel Dupuy (stackoverflow.com/users/37785/emmanuel-dupuy) could answer.Alderson
so with plugin for Eclipse how can I view code for a specific jar in Package Explorer?Fluttery
With Java Decompiler you can open the JAR file and go to File, Save All Sources. It saves all class files into java files =DAmbi
Please remember that it makes errors too. I have a class with a Member variable and it moved it to the parameter of a function, destroying the effect of the code. Watch out, it will get you.Maladjusted
jd.benow.ca is currently down. However, the Internet Archive has a snapshot of it from January: web.archive.org/web/20140105052622/http://jd.benow.caAntinucleon
@Maladjusted I think this was an optimisation done by the compiler, not by the decompiler...Deplore
Is there any way to prevent from my code to be decompiled ? If I store sensitive information inside the CLASS filesDolliedolloff
Doesn't work if you only have Java 8 installed on your system.Brogle
JD is a good starting point but fail to decompile complex code. A good alternative is use github.com/JetBrains/intellij-community/tree/master/plugins/…Chiquita
@DavidKennedyAraujo Thank you. I have included your comment in the answer for more visibility.Alderson
Is there a download location for fernflower.jar?Elvinelvina
@Elvinelvina Maybe javadecompilers.com? or github.com/fesh0r/fernflower (but requiring a compilation)Alderson
Quick answer: Get the complied code that uses Java 17 here: github.com/Vineflower/vineflower/releases. Use command: java -jar vineflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\souceHaggai
@Haggai Thank you for the update. I have included your comment in the answer for more visibility.Alderson
H
41

First of all, it's worth remembering that all Java archive files (.jar/.war/etc...) are all basically just fancy.zip files, with a few added manifests and metadata.

Second, to tackle this problem I personally use several tools which handle this problem on all levels:

  • Jad + Jadclipse while working in IDE for decompiling .class files
  • WinRAR, my favorite compression tool natively supports Java archives (again, see first paragraph).
  • Beyond Compare, my favorite diff tool, when configured correctly can do on-the-fly comparisons between any archive file, including jars. Well worth a try.

The advantage of all the aforementioned, is that I do not need to hold any other external tool which clutters my work environment. Everything I will ever need from one of those files can be handled inside my IDE or diffed with other files natively.

Herdic answered 15/3, 2009 at 9:0 Comment(0)
P
38

If you happen to have both a bash shell and jad:

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

I might be a tiny, tiny bit off with that, but it should work more or less as advertised. You should end up with $JAR.tmp containing your decompiled files.

Pannonia answered 15/3, 2009 at 4:40 Comment(3)
on ubuntu use #!/bin/bash instead of #!/bin/sh becausw pushd doesnt work for the default ubuntu shell...Ichabod
I'm using javap within this basic loop structure, and it's working for me.Agonize
@Ichabod or use /bin/sh (more portable) with cd and cd -, which is enough for this use case :-)Carnahan
P
28

I have had reasonable success with a tool named (frustratingly) "JD: Java Decompiler".

I have found it better than most decompilers when dealing with classes compiled for Java 5 and higher. Unfortunately, it can still have some hiccups where JAD would normally succeed.

Propman answered 27/3, 2009 at 11:37 Comment(2)
I couldn't download Windows or Linux version of JD-GUI. Is this problem only appears to me?Vishinsky
@JanusTroelsen I deleted it. Thank you for notifying it. Lets keep answers clean :)Riesman
Q
14

Something like:

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

maybe?

Queri answered 5/2, 2010 at 16:47 Comment(2)
I've used jad for a while and needed a quick way to extract and decompile a whole jar. Thanks, this helped immensely.Gipsy
Worked immediatelyLofton
R
5

Insert the following into decompile.jar.sh

# 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 //executable
  • ln -s ./decomplie.jar.s /usr/bin/dj

Ready to use, just type dj your.jar and you will get your.jar.src folder with sources. Use -d option for debug mode.

Reddick answered 12/4, 2011 at 9:37 Comment(2)
Thanks, but had to change "jad" to "./jad" on line 23 and run "bash decompile.jar.sh foo.jar -d" as I did not want to pollute my bin folderShopper
any recompiler ? recompiles jad files into jar ?Derwent
B
1

Note: This solution only works for Mac and *nix users.

I also tried to find Jad with no luck. My quick solution was to download MacJad that contains jad. Once you downloaded it you can find jad in [where-you-downloaded-macjad]/MacJAD/Contents/Resources/jad.

Brott answered 27/3, 2009 at 11:31 Comment(0)
S
0

You extract it and then use jad against the dir.

Stripling answered 15/3, 2009 at 2:14 Comment(2)
I don't think you can just run it against the dir. You will have to specify {dir}/**/*.classMordvin
Extract the jar and use something like jad {dir}, I have just tested it and doesn't work on windowsJoannajoanne

© 2022 - 2024 — McMap. All rights reserved.