Как декомпилировать JAR-файл целиком в JD-GUI и через командную строку

Чтобы получить исходники из JAR, откройте его в JD-GUI и нажмите Ctrl+Alt+S: программа сохранит архив с файлами .java.

Разбираем, куда пропадают классы с $ в имени, как выгрузить код через CFR и Vineflower и почему jd-gui.exe не запускается без JAVA_HOME.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3267 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3921 экспертное мнение Подписаться на Телеграм-канал
Обложка: Как декомпилировать JAR-файл целиком в JD-GUI и через командную строку

Чтобы декомпилировать весь JAR-файл, откройте его в JD-GUI через File → Open File… или просто перетащите в окно программы. Затем выберите File → Save All Sources (Ctrl+Alt+S, на macOS Cmd+Alt+S). JD-GUI соберёт архив с расширением .src.zip, внутри лежат файлы .java в той же структуре пакетов, что и в JAR.

Классы с символом $ в имени отдельными файлами не сохраняются: их код окажется внутри внешнего класса. Если JD-GUI плохо разбирает свежий синтаксис Java, подойдут консольные CFR или Vineflower. Как просто запустить или открыть архив без декомпиляции, мы разобрали в статье «Как открыть файл JAR».

Что понадобится перед декомпиляцией

Рой открывает JAR-архив и разбирает классы

Все декомпиляторы из этой статьи написаны на Java, поэтому на компьютере должна стоять Java. Если её нет, сначала пройдите нашу инструкцию по установке Java на Windows, macOS и Linux.

Дальше выбирайте инструмент под задачу:

Инструмент Как работает Последний выпуск Лицензия
JD-GUI окно с деревом классов 1.6.6, 25 декабря 2019 GPL-3.0
CFR командная строка 0.152, 11 декабря 2021 MIT
Vineflower командная строка, плагин для IntelliJ IDEA 1.12.0, 29 апреля 2026 Apache-2.0
Fernflower встроен в IntelliJ IDEA, есть консольный режим выходит вместе с IntelliJ Apache-2.0

Для разового просмотра хватит JD-GUI. Если нужно выгрузить исходники из десятков архивов или из одного огромного, удобнее консольный инструмент: его можно вызвать из скрипта.

Как декомпилировать JAR в JD-GUI: пошагово

Интерфейс у JD-GUI только английский, поэтому пункты меню привожу так, как они написаны в программе.

  1. Откройте страницу выпусков JD-GUI на GitHub и скачайте файл под свою систему: jd-gui-windows-1.6.6.zip для Windows, jd-gui-osx-1.6.6.tar для macOS, .deb или .rpm для Linux. Есть и универсальный jd-gui-1.6.6.jar, он запускается на любой системе с Java.
  2. Запустите программу: jd-gui.exe в Windows, приложение JD-GUI в macOS или команду java -jar jd-gui-1.6.6.jar в терминале.
  3. Откройте архив через File → Open File… (Ctrl+O) или перетащите JAR из проводника в окно.
  4. Слева появится дерево пакетов. Кликните по классу, и справа откроется восстановленный код.
  5. Выберите File → Save All Sources или нажмите Ctrl+Alt+S.
  6. Укажите папку. Программа предложит имя архива, которое заканчивается на .src.zip.
  7. Распакуйте архив любым архиватором. Внутри будут файлы .java, разложенные по папкам пакетов.

Save All Sources работает не только с JAR. В коде JD-GUI тот же механизм сохранения подключён для .war, .ear, .aar, .jmod и обычных .zip, так что веб-приложение или Android-библиотеку выгружают так же.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Почему нет файлов с $: «проблема подклассов»

Рой находит вложенные классы внутри внешнего

Откройте любой JAR в архиваторе, и рядом с Order.class почти наверняка найдутся Order$Item.class и Order$1.class. Так выглядят вложенные классы, наследование тут ни при чём. Их проходят вместе с основами ООП, этот этап есть в нашем плане, как стать Java-программистом. Компилятор кладёт каждый из них в отдельный файл, а имя строит по правилам спецификации языка Java, раздел 13.1:

  • класс-член: имя внешнего класса, $ и простое имя, например Order$Item;
  • анонимный класс: имя внешнего класса, $ и номер, например Order$1;
  • локальный класс внутри метода: имя внешнего класса, $, номер и имя, например Order$1Local.

Для примера, такой набор в архиве:

com/example/Order.class
com/example/Order$Item.class
com/example/Order$1.class

после Save All Sources превратится в один файл com/example/Order.java. В исходниках JD-GUI файлы с $ в счёт сохраняемых не идут: декомпилятор разбирает их вместе с внешним классом и вставляет код внутрь него.

Решение: не ищите Order$1.java, откройте Order.java. И декомпилируйте архив целиком, а не отдельный файл с $: без внешнего класса вложенный выглядит обрывком.

У консольных инструментов то же поведение по умолчанию. В CFR за это отвечает опция --innerclasses, она включена (в списке опций CFR: «Decompile inner classes»). У Fernflower это din со значением 1 по умолчанию.

CheckroiCheckroiПодборка курсов по Java-разработке96 курсов • 21 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Декомпиляция из командной строки: CFR, Vineflower, Fernflower

Консольный вариант нужен, когда архивов много, когда архив огромный или когда исходники надо выгружать скриптом. Команды ниже взяты из README самих проектов, подставьте свои имена файлов.

CFR

По документации CFR достаточно передать путь к JAR и папку для результата:

java -jar cfr-0.152.jar app.jar --outputdir src

Для огромного архива пригодится --jarfilter: CFR разберёт только классы, полное имя которых подходит под регулярное выражение. Например, только ваш пакет без сторонних библиотек:

java -jar cfr-0.152.jar app.jar --outputdir src --jarfilter com.example

Сам CFR целиком написан на Java 6, поэтому запустится почти на любой установленной Java. С новыми возможностями языка сложнее: в README CFR сказано про «большую часть» Java 9, 12 и 14.

Vineflower

Vineflower вырос из Fernflower и Quiltflower. В README Vineflower заявлена поддержка Java 21 и новее: records, sealed-классы, switch-выражения, сопоставление с образцом. Команда:

java -jar vineflower-1.12.0.jar app.jar src/

Учтите требование к Java: версии Vineflower от 1.11 запускаются только на Java 17 и новее.

Fernflower

Это тот самый движок, который встроен в IntelliJ IDEA. Формат команды из README:

CheckroiCheckroiПодборка курсов по IntelliJ IDEA21 курс • 8 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→
java -jar fernflower.jar -dgs=1 app.jar src/

Отдельные выпуски Fernflower JetBrains публикует в своём репозитории IntelliJ, а не на странице GitHub, поэтому новичку проще взять Vineflower: у него обычные выпуски с готовым JAR. Если карьера в Java только начинается, пригодится и наш план, как стать Java-разработчиком.

Как посмотреть код в IntelliJ IDEA

Если вам нужен не весь архив, а пара классов из библиотеки, JD-GUI можно не ставить. По справке IntelliJ IDEA декомпилятор на базе Fernflower включён по умолчанию:

  1. Откройте в редакторе скомпилированный файл .class.
  2. При первом открытии IDE покажет окно JetBrains Decompiler с условиями. Примите их, и окно больше не появится.
  3. Над кодом появится плашка о том, что файл декомпилирован. В таком коде можно ставить точки останова.

Если код не показывается, загляните в настройки: Ctrl+Alt+S, раздел Plugins. Там найдите плагин Java Bytecode Decompiler и нажмите Enable.

Чтобы выгрузить архив целиком в файлы .java, берите консольные инструменты из прошлого раздела. А если хотите, чтобы IDE показывала код через Vineflower, поставьте его плагин: по README он заменяет Fernflower внутри IntelliJ IDEA.

Работу в самой IDE разбирают на курсах по IntelliJ IDEA, а если вам ближе другая среда, загляните в наш разбор Eclipse.

Частые проблемы и что с ними делать

Набор инструментов для разбора JAR-файлов

jd-gui.exe не запускается и просит Java

Обёртка для Windows ищет Java по переменной окружения JAVA_HOME: так она настроена в сборочном файле JD-GUI.

Решение: пропишите JAVA_HOME на папку с установленной Java или запустите универсальный jd-gui-1.6.6.jar командой java -jar.

Пункт Save All Sources серый

Пункт включается, когда в окне выбрана вкладка открытого архива. Если архив не открыт, нажать его нельзя.

Решение: откройте архив заново или переключитесь на его вкладку и нажмите Ctrl+Alt+S ещё раз.

Вместо имён классов и методов буквы a, b, c

Архив обфусцирован: исходные имена при сборке заменили короткими, и декомпилятор их не восстановит. У Fernflower есть опция -ren=1, она переименовывает неоднозначные и обфусцированные элементы, чтобы код хотя бы читался без путаницы.

Нет комментариев и названий переменных

Комментариев в байткоде нет вообще. Имена локальных переменных попадают в .class, только если код собирали с отладочной информацией: по документации javac ключ -g добавляет её целиком, а по умолчанию сохраняются только номера строк и имя исходного файла. Поэтому вместо price вы часто увидите var1.

Свежий синтаксис выглядит странно

Последний выпуск JD-GUI вышел в декабре 2019 года. Если в коде records или новые формы switch и результат выглядит запутанным, прогоните тот же JAR через Vineflower.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Можно ли декомпилировать чужой JAR

Свой код декомпилируйте сколько угодно, например когда исходники потерялись, а собранный JAR остался.

С чужим сложнее. Пункт 3 статьи 1280 ГК РФ разрешает лицу, правомерно владеющему экземпляром программы, декомпилировать её без согласия правообладателя, но только ради совместимости своей независимо написанной программы с другими. Условий три:

  • нужной для совместимости информации не было в других источниках;
  • декомпилируются только те части программы, которые для этого нужны;
  • полученное используется только для совместимости, его нельзя передавать другим и нельзя брать для разработки программы, по своему виду существенно схожей с декомпилируемой.

Профессиональным разбором чужих программ занимаются реверс-инженеры, подробнее в нашем материале о том, как устроена эта работа.

Где освоить Java системно

Декомпилятор показывает, что внутри готового архива, но читать восстановленный код без знания языка тяжело. Если хотите понимать, как устроены классы, сборка и библиотеки, посмотрите курсы по Java и наш обзор профессии Java-разработчика.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия Java-разработчик + ИИ
Перейти на сайт курса
SkillboxSkillbox191 390 ₽5617 ₽/мес.8 месяцевОбзор курса
Профессия «Java-разработчик с нуля»
Перейти на сайт курса
НетологияНетология99 500 ₽5625 ₽/мес.11 месяцевОбзор курса
Профессия Java-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.8 месяцевОбзор курса
Профессия «Java-разработчик PRO»
Перейти на сайт курса
SkillboxSkillbox181 500 ₽5855 ₽/мес.12 месяцевОбзор курса
Java-разработчик
Перейти на сайт курса
Академия ЭдюсонЭдюсон133 900 ₽5579 ₽/мес.8 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Java-разработке

Часто задаваемые вопросы

Что такое JD-GUI?

Это бесплатная программа с окном, которая показывает исходный код Java из файлов .class и архивов JAR. Распространяется по лицензии GPL-3.0, последняя версия 1.6.6 вышла 25 декабря 2019 года.

Где скачать JD-GUI?

На странице выпусков проекта на GitHub. Там лежат сборки для Windows (zip), macOS (tar), Linux (deb и rpm) и универсальный jd-gui-1.6.6.jar, который запускается на любой системе с Java.

Как декомпилировать JAR в IntelliJ IDEA?

Откройте файл .class в редакторе: встроенный декомпилятор на базе Fernflower включён по умолчанию и покажет читаемый код. Чтобы выгрузить весь архив в файлы .java, используйте CFR или Vineflower из командной строки.

Почему после декомпиляции нет файлов с $ в имени?

Так называются вложенные и анонимные классы. JD-GUI, CFR и Fernflower по умолчанию разбирают их вместе с внешним классом, поэтому код из Order$1.class окажется внутри Order.java.

Можно ли декомпилировать чужую программу?

По пункту 3 статьи 1280 ГК РФ тот, кто правомерно владеет экземпляром программы, может декомпилировать её без согласия правообладателя, но только ради совместимости своей независимо написанной программы с другими и только в нужных для этого частях.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!